2015-05-31 116 views
2

我的以下示例使用可变参数模板注册一个类的内部的功能。注册单个函数可以工作,但类成员函数又如何?我试过std :: bind,但是这期望占位符不是一个选项,因为我不知道参数的数量。有没有一种简单的方法在C++ 11中执行此操作,还是我不得不为每个参数实现注册函数?C++成员函数结合具有可变参数模板

template<typename TReturn, typename... TArgs> 
class Func { 
    std::function<TReturn (TArgs...)> fn; 

    template<typename TFunction, typename TObject> 
    bool register(TFunction f, TObject obj){ 

    } 

    bool register(std::function<TReturn (TArgs...)> f){ 
     fn = f; 
     return true; 
    } 
} 
+0

你不会有太多的乐趣调用一个函数'register'因为这标识符是关键字。更重要的是,你似乎有两个名字和一个没有实现的函数:你期望函数做什么? –

+0

我忘了更改名称。你说得对,这是行不通的。让我们忘记第二个功能。我想要的是在fn中存储一个类成员函数。 – Gustavo

+0

你不需要为成员函数分开过载,用户可以使用过载服用'的std :: function',并通过'的std ::绑定(&X ::楼OBJ,ARGS ...)'或一个合适的函子。 – 0x499602D2

回答

3

创建一个带有所需签名的lambda函数并从中构造std::function对象。

template<typename TReturn, typename... TArgs> 
class Func { 
    std::function<TReturn (TArgs...)> fn; 

    template<typename TFunction, typename TObject> 
    bool Register(TFunction f, TObject obj){ 
     fn = [obj](TArgs... args){return (obj.*f)(args...);}; 
     return true; 
    } 

    bool Register(std::function<TReturn (TArgs...)> f){ 
     fn = f; 
     return true; 
    } 
} 

(注意:Member function pointers需要与一个相应的对象,对象的引用或指针到适当的类的对象被用于如果TObject是值状,所述成员函数调用语法将(obj.*f)如果。 TObject是指针状,语法为(obj->*f)

+0

fn = [&](TArgs ... args){return(obj - > * f)(args ...);};但在调用fn时会出现分段错误。非类成员函数效果很好。 – Gustavo

+1

@Gustavo将调用改为'(obj。* f)(args ...)'。解除引用的绑定比调用弱。如果您继续发生seg故障,我们需要一个可重现的例子。 – 0x499602D2

+0

这不会编译,因为我将指向该对象的指针指向寄存器函数。 – Gustavo

相关问题