将模板参数作为目标类型传递

Mar*_*ram 3 c++ templates c++11

在这个缩短的示例(不是真实世界的代码)中,我试图Callback用一个调用int &,但是,当通过该CallMethod方法时,模板参数被解释为一个int,这意味着它无法将其转换为目标参数类型.

这可能吗?我知道我可以在调用时将参数强制转换为正确的类型CallMethod,但是如果可能的话,我希望解决方案是隐式的.

#include <functional>
#include <iostream>

using namespace std;

void Callback(int &value)
{
    value = 42;
}

template <typename Method, typename ...Params>
void CallMethod(Method method, Params ...params)
{
    method(std::forward<Params>(params)...);
}

int main()
{
    int value = 0;
    CallMethod(&Callback, value);

    cout << "Value: " << value << endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Tar*_*ama 6

你没有正确转发你的论点.为了使用完美转发,std::forward应该对转发引用进行操作,即在推导的上下文中有rvalue引用时.你的CallMethod功能应该是这样的:

template <typename Method, typename ...Params>
void CallMethod(Method method, Params&& ...params)
{
    method(std::forward<Params>(params)...);
}
Run Code Online (Sandbox Code Playgroud)

演示