C ++绑定成员函数与可变参数模板

时间:2015-05-31 15:51:19

标签: c++ function templates c++11 bind

我的示例使用可变参数模板在类中注册函数。注册单个函数但是类成员函数呢?我尝试过std :: bind但是这个期望占位符不是一个选项,因为我不知道参数的数量。有没有一种简单的方法在C ++ 11中执行此操作,或者我是否被迫为每个参数实现寄存器函数?

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

1 个答案:

答案 0 :(得分: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)。)