带有可变模板的c++绑定成员函数

C++ bind member function with variadic template

本文关键字:c++ 绑定 成员 函数      更新时间:2023-10-16

下面的例子使用可变模板在类中注册函数。注册单个函数可以工作,但是类成员函数呢?我尝试了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;
    }   
}

创建一个具有所需签名的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;
    }   
}
(注:成员函数指针需要与相应的对象、对象引用或指向适当类的对象的指针一起使用。如果TObject是类值的,则成员函数调用语法将是(obj.*f)。如果TObject是类似指针的,语法将是(obj->*f)。)