gpt4 book ai didi

c++ - 是否可以编写 C++ 模板/宏来检查两个函数是否具有相同的签名

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:55:10 24 4
gpt4 key购买 nike

是否可以编写 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...
}

那么这是有可能的还是只是一个白日梦?

附言事实上,我对 C++ 2003 标准很感兴趣。

最佳答案

C++11解决方案

无需自己编写任何模板。

您可以将 decltypestd::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

希望对您有所帮助。

关于c++ - 是否可以编写 C++ 模板/宏来检查两个函数是否具有相同的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14541519/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com