函数指针的C ++ 11 HOWTO模板别名

时间:2014-10-30 12:30:07

标签: c++ visual-c++ c++11

我需要在Visual Studio 2013上编译代码

原来我有:

class P
{
    typedef void* (P::*FunctionPtr)(void);
    typedef void* (*T_ptr)(void*);

    private:    
        T_ptr getCompatibleFunctionPointer(FunctionPtr funcPtr);
        T_ptr m_t_ptr;

    public:
        [omitting constructors, etc]
}

现在,添加模板需要使用关键字,所以我尝试了:

typedef  void* (*T_ptr)(void*);

//tried this:
template<typename objectThread>
using FunctionPtr = void(P<objectThread>::*)(void);
//also tried:
template<typename objectThread>
using FunctionPtr = void(P< typename objectThread>::*)(void);
//also tried:
template<typename objectThread>
using FunctionPtr = void(P< typename objectThread>*)(void);

template<typename objectThread>
class P{


private:

    template<typename objectThread>
    T_ptr P<objectThread>::getCompatibleFunctionPointer(FunctionPtr funcPtr) {}
    T_ptr m_t_ptr;

};

我无法找到实现我需要的方法。我确实需要保留模板,不能使用Boost(以防万一)。

2 个答案:

答案 0 :(得分:1)

你可以在课堂上用

声明它
using FunctionPtr = void(P<objectThread>::*)();

并且只是在课堂上使用它。

所以,你的代码只是

template<typename objectThread>
class P{
    using T_ptr = void*(*)(void*);
    using FunctionPtr = void(P<objectThread>::*)();
private:
    T_ptr getCompatibleFunctionPointer(FunctionPtr funcPtr) {}
    T_ptr m_t_ptr;
};

答案 1 :(得分:0)

我没有看到问题。唯一看起来很奇怪的是你在别名中使用P作为类模板。在代码段中,P不是模板。

无论如何,这是我用于成员函数指针的内容:

template <typename Class, typename Ret, typename ... Args>
using MemFunPtr = Ret (Class::*)(Args ...);

你可以像这样使用它:

struct A
{
    void fun(int, char) { cout << "whoop\n"; }
};


int main()
{
    MemFunPtr<A, void, int, char> m = &A::fun;

    A a;
    (a.*m)(5, 'a');
}