2つの関数が同じシグネチャを持っているかどうかを確認する方法はありますか?例えば:
int funA (int a, int b);
int funB (int a, int b);
float funC (int a, int b);
int funD (float a, int b);
この例では、funA
とfunB
が、true
を返す必要がある関数の唯一の組み合わせです。
基本的に、2つの関数のタイプが同じかどうかを確認します。
std::is_same_v<decltype(funA), decltype(funB)>
私はこれを「シグネチャの比較」とは呼びません。私が正しく覚えていれば、戻り値の型はシグネチャの一部ではないからです(オーバーロードの解決に影響を与えないため)。
関数タイプは decltype
および std::is_same
。例えば.
std::is_same_v<decltype(funA), decltype(funB)> // true
他の人はstd::is_same
およびdecltype
。
ここで、任意の数の関数シグネチャの比較を一般化するために、以下を実行できます。
#include <type_traits> // std::is_same, std::conjunction_v
template<typename Func, typename... Funcs>
constexpr bool areSameFunctions = std::conjunction_v<std::is_same<Func, Funcs>...>;
そして、好きなだけ多くの機能を比較します
areSameFunctions<decltype(funA), decltype(funB), decltype(funC)>
( ライブデモを参照 )
または、タイピングを減らすには(つまり、decltype
を使わずに)、関数として作成します
template<typename Func, typename... Funcs>
constexpr bool areSameFunctions(Func&&, Funcs&&...)
{
return std::conjunction_v<std::is_same<Func, Funcs>...>;
}
と単に呼び出す
areSameFunctions(funA, funB, funC)
( ライブデモを参照 )
言及されていない別の可能性として、typeid
および==
のtypeinfo
を使用できます。
#include <typeinfo>
if(typeid(funA) != typeid(funB))
std::cerr << "Types not the same" << std::endl;