繁体   English   中英

将带有可变参数 arguments 的模板 function 分配给 function 指针

[英]Assignen a template function with Variadic arguments to a function pointer

在 C++ 中,我正在尝试制作采用第一个参数并在其上调用方法的转发包装器。 这最终出现在给定代码中的wrapper方法中。 这在调用它时工作正常。

但是我想将此模板化包装器分配给 function 指针。 在我的用例中,function 指针是给定的,我无法将其更改为std::function或类似的东西。 这是因为它使用的地方是 C api。

我确实创建了以下示例:

#include <iostream>

template<auto FUNC, typename T, typename ... Params>
static auto wrapper(void* handle, Params&& ... args) {
    auto* ser = static_cast<T*>(handle);
    return (ser->*FUNC)(std::forward<Params>(args)...);
}

class MyTestClass {
public:
    int method1(int i, int j) { return i + j; }

    float method2(float f) {
        return f * 2;
    }
};

int main() {
    MyTestClass thing{};

    int (*serialize)(void* handle, int i, int j);

    serialize = wrapper<&MyTestClass::method1, MyTestClass>;
    
    auto callMethod1Result = wrapper<&MyTestClass::method1, MyTestClass>(&thing, 1, 2);
    std::cout << "callMethod1Result: " << callMethod1Result << std::endl;

    return 0;
}

该方法的调用工作正常,但是:

    int (*serialize)(void* handle, int i, int j);
    serialize = wrapper<&MyTestClass::method1, MyTestClass>;

不起作用,给我错误:

/.../temp.cpp:23:17: error: no matches converting function ‘wrapper’ to type ‘int (*)(void*, int, int)’
     serialize = wrapper<&MyTestClass::method1, MyTestClass>;
                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/.../temp.cpp:4:13: note: candidate is: ‘template<auto FUNC, class T, class ... Params> auto wrapper(void*, Params&& ...)’
 static auto wrapper(void* handle, Params&& ... args) {
             ^~~~~~~

经过一番尝试,我确实发现Params&&... args部分导致了这个问题,因为如果我制作一个没有可变参数的更明确的包装器,那么它确实有效。

我的主要问题是:我可以将带有可变参数的模板化方法分配给 function 指针吗?如何?

问题是wrapperargs作为转发引用,它的类型总是引用:lvalue-reference 或 rvalue-reference。 但是serialize被声明为 function 指针,采用int类型的ij按值,它们不能匹配引用类型,这使得Params的模板参数推导在serialize = wrapper<&MyTestClass::method1, MyTestClass>;中失败。 .

您可以通过在serialize声明中更改ij的类型来修复它。

例如

int (*serialize)(void* handle, int&& i, int&& j);
serialize = wrapper<&MyTestClass::method1, MyTestClass>;

实况 Clang实况 Gcc

或者更改wrapper以按值args

例如

template<auto FUNC, typename T, typename ... Params>
static auto wrapper(void* handle, Params ... args)

实况 Clang实况 Gcc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM