是否可以写C ++模板/宏检查两个功能是否具有相同签名(返回类型和参数列表)?
下面是我要如何使用它一个简单的例子:
int foo(const std::string& s) {...}
int bar(const std::string& s) {...}
if (SAME_SIGNATURES(foo, bar))
{
// do something useful... make Qt signal-slot connection for example...
}
else
{
// signatures mismatch.. report a problem or something...
}
那么,这可能在某种程度上还是只是一个白日梦?
PS其实我在C ++ 2003标准有意思。
C ++ 11解
不需要自己写任何模板。
您可以使用decltype
沿std::is_same
:
if (std::is_same<decltype(foo),decltype(bar)>::value )
{
std::cout << "foo and bar has same signature" << std::endl;
}
这里decltype
返回它的功能在这种情况下,表达的类型 ,和std::is_same
两种类型进行了比较,并返回true
如果两个相同,否则false
。
C ++ 03解决方案
在C ++ 03,你不必decltype
,这样你就可以实现重载函数模板为:
template<typename T>
bool is_same(T,T) { return true; }
template<typename T, typename U>
bool is_same(T,U) { return false; }
现在,你可以使用它作为:
if (is_same(foo, bar))
{
std::cout << "foo and bar has same signature" << std::endl;
}
现在,在这种情况下is_same
是一个函数模板,而不是类模板。 因此,它在运行时进行评估,而不是编译时。 因此,这将给错误:
int a[is_same(foo,bar) ? 10 : 20]; //error (in Standard C++03)
//the size must be known at compile-time!
但是,如果您需要在编译时知道的话,那么你的工作多,实现的功能为:
typedef char same[1];
typedef char different[2];
template<typename T>
same& is_same_helper(T,T); //no need to define it now!
template<typename T, typename U>
different& is_same_helper(T,U); //no definition needed!
#define is_same(x,y) (sizeof(is_same_helper(x,y)) == sizeof(same))
现在使用它作为:
if (is_same(foo, bar))
{
std::cout << "foo and bar has same signature" << std::endl;
}
你可以在编译时也使用它。 所以你可以写:
int a[is_same(foo,bar) ? 10 : 20]; //okay
希望帮助。
什么是这样的:
#include <iostream>
void a(int)
{ }
void a2(int)
{ }
void b(float)
{ }
struct true_type
{ enum { value = 1 }; };
struct false_type
{ enum { value = 0 }; };
template <typename T, typename U>
false_type
is_same_sig (T, U)
{ return false_type (); }
template <typename T>
true_type
is_same_sig (T, T)
{ return true_type (); }
int
main ()
{
std::cout << is_same_sig (a, a2).value
<< is_same_sig (a, b).value
<< "\n";
}
下面是用C ++ 03中的另一种替代解决方案:
#include <iostream>
using namespace std;
template<typename F1, typename F2>
bool same_signature(F1 const&, F2 const&)
{
return false;
}
template<typename F>
bool same_signature(F const&, F const&)
{
return true;
}
void test1(std::string, int) { }
void test2(std::string, int) { }
void test3(std::string, double) { }
int main()
{
cout << same_signature(test1, test2);
cout << same_signature(test1, test3);
}
文章来源: Is it possible to write c++ template/macros to check whether two functions have the same signatures