检查两个不同类中定义的两个方法的签名是否完全相同,最优雅的方式(可能是C ++ 17方式)是什么?
例如:
template< typename ...Ts >
struct A
{
void f(Ts...);
};
template< typename ...Ts >
struct B
{
void g(Ts...);
};
static_assert(has_same_signatures< decltype(&A<>::f), decltype(&B<>::g) >{});
static_assert(!has_same_signatures< decltype(&A< int >::f), decltype(&B< char >::g) >{});
//static_assert(has_same_signatures< decltype(&A< void >::f), decltype(&B<>::g) >{}); // don't know is it feasible w/o extra complexity
如果允许任何一方的非成员函数的类型也是很好的。
也许结果类型也应该被纠缠。
该任务源于 Qt 框架中匹配信号/插槽签名的常见问题。
答案 0 :(得分:1)
您可以执行以下操作:
// static member functions / free functions are the same
// if their types are the same
template <class T, class U>
struct has_same_signature : std::is_same<T, U> { };
// member functions have the same signature if they're two pointers to members
// with the same pointed-to type
template <class T, class C1, class C2>
struct has_same_signature<T C1::*, T C2::*> : std::true_type { };
请注意A<void>
只是格式不正确,因为您不能拥有void
类型的参数。