web-dev-qa-db-ja.com

2つの関数のシグネチャを比較するにはどうすればよいですか?

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);

この例では、funAfunBが、trueを返す必要がある関数の唯一の組み合わせです。

35

基本的に、2つの関数のタイプが同じかどうかを確認します。

std::is_same_v<decltype(funA), decltype(funB)>

私はこれを「シグネチャの比較」とは呼びません。私が正しく覚えていれば、戻り値の型はシグネチャの一部ではないからです(オーバーロードの解決に影響を与えないため)。

39
HolyBlackCat

関数タイプは decltype および std::is_same 。例えば.

std::is_same_v<decltype(funA), decltype(funB)>  // true

[〜#〜]ライブ[〜#〜]

15
songyuanyao

他の人は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) 

ライブデモを参照

14
JeJo

言及されていない別の可能性として、typeidおよび==typeinfoを使用できます。

#include <typeinfo>

if(typeid(funA) != typeid(funB))
    std::cerr << "Types not the same" << std::endl;
3
S.S. Anne