微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

总的来说,我不知道如何创建这样的类型:

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

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

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

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

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

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

如何为以“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);
}

解决方法

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

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...);
// ...
};

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

Demo/Demo2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。