c++ - 如何将可变参数从一个模板传递到另一个模板
问题描述
我有这个代码:
#include <tuple>
#include <memory>
template <typename ...Args>
class Button
{
Button(const std::string& name, Args&& ...args) {
std::tuple<Args...> tuple_ = std::tuple<Args...>(args...);
}
};
template<typename T1, typename ...Args>
void addObject(const std::string& name, Args&& ...args) {
std::unique_ptr<T1> obj(new T1(name, std::forward<Args>(args)...));
//...rest of the code...
}
int main() {
//if we comment the next line it compiles well
addObject<Button>("BtnName", 0, 1, 2);
return 0;
}
但是,它不会在编译时出现“错误 LNK2019:无法解析的外部符号...”或“没有用于调用 'addObject class Button>(const char [8], int, int, int)' 的匹配函数”之类的错误。如果我们注释“addObject”函数,它编译得很好。
如何以正确的方式将 args 传递给另一个模板?
解决方案
Button
是一个类模板;在 中使用它时addObject<Button>("BtnName", 0, 1, 2);
,您必须为它指定模板参数,例如Button<...some arguments...>
.
除了上面的解决方案,也许你想将模板参数Args
从类移动到构造函数Button
,那么它可以从函数参数(即std::forward<Args>(args)...
)推导出来。
class Button
{
public:
template <typename ...Args>
Button(const std::string& name, Args&& ...args) {
std::tuple<Args...> tuple_ = std::tuple<Args...>(std::forward<Args>(args)...);
}
};
其他问题:
- 的构造函数
Button
是private
。 - 没有
#include <string>
。
推荐阅读
- android - ReactNative 应用程序的富文本编辑器
- android - 将 RecyclerView 项目更改为高于所有其他项目
- python - 如何使用 python boto3 将文本文件内容作为邮件正文发送?
- mysql - MySQL - 退出存储过程
- elasticsearch - 停止 Logstash 时 Elasticsearch 已创建索引
- java - 如何在 if 块内重构 Single/Observable 的公共映射
- gnuradio - GNU Radio BPSK BER 模拟:RRC 脉冲幅度归一化
- python - 正则表达式在 python 3.x 中提取日期
- sql - SQL 语句与“IN”一起使用,但是当尝试使用“NOT IN”获得相反(反转)的结果时,它会输出所有内容
- python - scikit-learn PCA方法中百分比值的解释