将模板参数作为目标类型传递
Passing template arguments as target type
在这个简短的例子中(不是现实世界的代码),我试图用int &
调用Callback
,但是,当通过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;
}
您没有正确转发您的参数。为了使用完美转发,std::forward
应该对转发引用进行操作,这是当您在推导的上下文中有右值引用时。您的CallMethod
函数应该如下所示:
template <typename Method, typename ...Params>
void CallMethod(Method method, Params&& ...params)
{
method(std::forward<Params>(params)...);
}
演示相关文章:
- 如何定义自定义生成配置类型,其中通常是.exe的目标改为 DLL
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 当前不会命中断点。没有调试器目标代码类型的可执行代码与此文件关联
- 提升不良词法强制转换:将字符串转换为无符号长整型时,无法将源类型值解释为目标
- 如果输入类型与目标类型不同,"cin"变量是否重置为某个默认值?
- memcpy是否取决于源指针和目标指针的类型
- CMake:什么是可能的目标源类型?它们可以扩展吗
- 对类型的非常量左值引用 - 使用类类型的参数时,目标C++包装器中的错误
- 致命错误LNK1112:在 npm 安装期间,模块计算机类型'X86'与目标计算机类型'x64'冲突
- 模块计算机类型和目标计算机类型 Visual Studio 2013
- 是动态铸造所需的目标类型
- 转换逻辑目标是什么类型
- 将参数转换为目标类型时,复制用于直接初始化的构造函数省略
- 致命错误LNK1112:通过 vcvarsall .bat x86 运行构建'X86'模块计算机类型'x64'与目标计算机类型冲突
- QtGui4.lib(QtGui4.dll):致命错误LNK1112:模块计算机类型"X86"与目标计算机类型"x64"冲突
- CLASS_NAME未声明 - 无法dynamic_cast(目标不是指向完整类型的指针或引用)
- LNK1112:模块计算机类型"x64"与目标计算机类型"X86"冲突:Qt创建者
- 什么导致类型不完整?(QGraphicsItem:源或目标具有不完整的类型)
- msvcprtd.lib(MSVCP100D.dll):致命错误LNK1112:模块计算机类型"X86"与目标计算机类型"x64"冲突
- 将模板参数作为目标类型传递