如何使用扩展的模板<typename... Args>函数参数列表创建类型?

How to create a type with expanded argument list of template<typename... Args> function?

总的来说,我不太清楚如何创建这样的类型:

template<typename... Args>
using TWrapper = void *(*)(void *target, Args... func_args);

我明白为什么会抛出错误,但我不知道该怎么办...

我正在开发一个 class 内容如下:

template<typename TFunc> //TFunc is a type of user's function
class CallManager {
    TFunc user_function = nullptr;
    void* inner_state; //For example

    template<typename... Args>
    using TWrapper = void *(CallManager::*)(void *const target, Args... func_args);

    TWrapper wrapper_from_another_instance = nullptr; //What do I need to specify in the template arguments if I don't know them?

    template <typename... Args> //I need to create a type for this function
    void* WrapUserFunction(void *const target, Args&&... func_args) {
        user_function(std::forward<Args>(func_args)...);
    }

    void setTargetExecutor(TWrapper wrapper) {
        wrapper_from_another_instance = wrapper;
    }
public:
    void setFunction(TFunc func) {
        user_function = func;
    }

    template <typename... Args>
    void makeCall(Args&&... func_args) {
        wrapper_from_another_instance(inner_state, std::forward<Args>(func_args)...);
    }

    void bindManager(const CallManager &next) { //Upd 1
        setTargetExecutor(next.WrapUserFunction);
    }
};

使用上面的示例 class,可能会注意到我需要一个“扩展”类型,以便为它创建一个指向函数的变量指针,然后调用它。

我的class接受一个自定义函数类型,但我不知道有多少参数以及它们是什么类型。是否有可能以某种方式提取参数列表?

如何为以“template”开头的函数创建类型?

如何用我自己的参数补充用户的类型以将结果保存在变量中以供调用?

UPD 1:用法示例

using myfunc = void(*)(char x, char y);

void myFunc(char x, char y) {
}

void main() {
    CallManager<myfunc> cmgr1;
    cmgr1.setFunction(myFunc);

    CallManager<myfunc> cmgr2;
    cmgr2.bindManager(cmgr1);

    cmgr2.makeCall(10, 15);
}

如果你限制你class使用函数指针,你可能会这样做:

template<typename TFunc> //TFunc is a type of user's function
class CallManager;

template<typename R, typename... Args>
class CallManager<R (*)(Args...)>
{
    using TFunc = R (*)(Args...);
    using TWrapper = void *(CallManager::*)(void *const, Args...);
// ...
};

如果你需要支持更多的可调用类型,我建议在相同的原则(template specialization)中创建一个“function_traits”作为助手。

Demo/Demo2