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つの関数が同じシグネチャを持っているかどうかを確認する方法はありますか?例えば:
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)>
私はこれを「シグネチャの比較」とは呼びません。私が正しく覚えていれば、戻り値の型はシグネチャの一部ではないからです(オーバーロードの解決に影響を与えないため)。
他の人は、およびを使用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
from typeinfo
と==
:
#include <typeinfo>
if(typeid(funA) != typeid(funB))
std::cerr << "Types not the same" << std::endl;
error: non-constant condition for static assertion
ます。
constexpr
。今は少し良い例があります。