使用辅助模板类可以简化成员函数的typedef吗?

时间:2011-07-09 18:25:35

标签: c++

我最近发现使用以下助手类时可以简化函数指针语法:

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?
};

有人可以帮忙吗?

1 个答案:

答案 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等函数类型是有效的。