我最近发现使用以下助手类时可以简化函数指针语法:
template<typename Sig>
struct Fun {
typedef Sig* Ptr;
};
它允许我指向void()
,如下所示:
typedef Fun<void()>::Ptr fun_ptr;
fun_ptr f = foo;
我想创建一个类似的实用程序来创建一个typedef到成员函数指针。它将允许以下语法:
struct Foo {
void bar() {}
};
typedef MemFun<Foo, void()>::Ptr bar_type;
bar_type b = &Foo::bar;
但是,我无法弄清楚typedef语法:
template<class T, typename Sig>
struct MemFun {
// How to use T and Sig to create member function typedef?
};
有人可以帮忙吗?
答案 0 :(得分:2)
template<typename T, typename Sig>
struct convenience {
typedef Sig T::*type;
};
struct test {
void member() {}
void cmember() const {}
};
static_assert( std::is_same<
convenience<test, void()>::type
, decltype(&test::member)
>::value, "Oops" );
static_assert( std::is_same<
convenience<test, void() const>::type
, decltype(&test::cmember)
>::value, "Oops" );
当Sig
参数是函数类型时,结果类型是指向成员函数的指针,而不是指向数据成员的指针。特别是,在此上下文中,void() const
等函数类型是有效的。