模板成员功能指针

时间:2012-04-11 22:46:15

标签: c++ templates member-function-pointers

我目前有一个问题,VS2010唠叨“Nuke”&的构造函数中使用的“TFunctionPointer”。因为datamember未定义。有人可以向我解释为什么会这样吗?非常感谢任何帮助。

template<typename T>
typedef void (T::* TFunctionPointer)();

class Nuke
{
public:
    Nuke( TFunctionPointer pFunction );
    virtual ~Nuke();

private:
    TFunctionPointer m_pFunction;

};

//编辑

我要做的是允许存储任何类型的类的函数指针,并在销毁Nuke对象时调用它。对RAII的一种扭曲。但我想这是不可能的。谢谢你的帮助。

//编辑

显然我正在寻找Boost :: shared_ptr。

2 个答案:

答案 0 :(得分:4)

模板typedef在C ++中不合法。

尽管如此(在“旧”和“新”C ++中)你可以做的是:

template <typename T>
struct TFunctionPointer
{
    typedef void (T::*Type)();
};

class Nuke
{
public:
    Nuke( TFunctionPointer<Nuke>::Type pFunction );
    virtual ~Nuke();

private:
    TFunctionPointer<Nuke>::Type m_pFunction;
};

答案 1 :(得分:0)

C ++不支持模板typedef,因此template<typename T> typedef是非法的。

如果您可以使用C ++ 11,则可以使用模板别名。我不太确定成员函数指针是否可行,并且不能保证语法正确,但我希望它类似于以下内容:

template <typename T>
using TFunctionPointer = void(T::*)();

当然VS2010可能不支持。

无论如何,你的Nuke类没有为TFunctionPointer提供类型,所以即使那个typedef合法,你也试图传递模板而不是具体类型,这不是可能。

您可以将函数指针包装到类型中并使用正确的实例化:

template<typename T> struct FunctionPointer { typedef void (T::*Type)(); };
class Nuke {
public:
    Nuke(FunctionPointer<Nuke>::Type pFunction);
    virtual ~Nuke();
private:
    FunctionPointer<Nuke>::Type m_pFunction;

};