输入trait以匹配不同类

时间:2017-08-14 16:03:42

标签: c++ qt metaprogramming c++17 typetraits

检查两个不同类中定义的两个方法的签名是否完全相同,最优雅的方式(可能是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 框架中匹配信号/插槽签名的常见问题。

1 个答案:

答案 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类型的参数。