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


回答:


39

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

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

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


20
戻り値の型は、関数ポインタのオーバーロード解決に関与し、関数テンプレートのシグネチャの一部です。
デイビスヘリング


14

他の人は、およびを使用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) 

ライブデモをご覧ください


3

言及されていない別の可能性として:typeidfrom typeinfo==

#include <typeinfo>

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

GCCがくれerror: non-constant condition for static assertionます。
-HolyBlackCat

1
@HolyBlackCatああ、これはRTTIです。これらがそうでないことを知りませんでしたconstexpr。今は少し良い例があります。
SS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.