C++ 如何将可变参数从一个模板传递到另一个模板
我有以下代码:C++ 如何将可变参数从一个模板传递到另一个模板,c++,templates,c++17,variadic-templates,C++,Templates,C++17,Variadic Templates,我有以下代码: #include <tuple> #include <memory> template <typename ...Args> class Button { Button(const std::string& name, Args&& ...args) { std::tuple<Args...> tuple_ = std::tuple<Args...>(args...);
#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;
}
#包括
#包括
模板
类按钮
{
按钮(常量标准::字符串和名称、参数和…参数){
std::tuple tuple\uux=std::tuple(args…);
}
};
模板
void addObject(const std::string&name,Args&&…Args){
std::unique_ptr obj(新T1(名称,std::forward(args)…);
//…代码的其余部分。。。
}
int main(){
//如果我们评论下一行,它编译得很好
addObject(“BtnName”,0,1,2);
返回0;
}
但是,编译时并没有出现诸如“错误LNK2019:未解析的外部符号…”或“调用“addObject class Button>(常量字符[8],int,int,int)”的匹配函数”之类的错误。如果我们注释“addObject”函数,它编译得很好
如何以正确的方式将参数传递给另一个模板?
按钮
是一个类模板;在addObject(“BtnName”,0,1,2)中使用时代码>,必须为其指定模板参数,如按钮
除了上面的解决方案之外,可能还需要将模板参数Args
从类移动到按钮的构造函数
,然后可以从函数参数(即std::forward)中推导出来
其他问题:
按钮的构造函数是私有的
- 没有
#include
您可以使模板具有template template type参数,这样就不必指定参数类型,如下所示
#include <tuple>
#include <memory>
#include <string>
template <typename ...Args>
struct Button
{
Button(const std::string& name, Args&& ...args) {
auto tuple_ = std::make_tuple<Args...>(std::forward<Args>(args)...);
}
};
template<template <typename ...Args> typename T1, typename ...Args>
void addObject(const std::string& name, Args&& ...args) {
auto obj = std::make_unique< T1 <Args...> >(name, std::forward<Args>(args)...);
//...rest of the code...
}
int main() {
addObject<Button>("BtnName", 0, 1, 2);
return 0;
}
#包括
#包括
#包括
模板
结构按钮
{
按钮(常量标准::字符串和名称、参数和…参数){
自动元组=std::make_元组(std::forward(args)…);
}
};
模板
void addObject(const std::string&name,Args&&…Args){
auto obj=std::make_unique(名称,std::forward(args)…);
//…代码的其余部分。。。
}
int main(){
addObject(“BtnName”,0,1,2);
返回0;
}
这里的按钮
不是一个类型;它是一个模板。因为它本身不是一个类型,所以将它作为typename
参数传递是没有意义的。将main
中的行更改为addObject(“BtnName”,0,1,2);
是否有帮助?显然这并不理想(为此,您需要使用template
template
参数,我现在没有时间写完整的答案),但如果这有帮助,它会给您一个开始的位置。应该使用std::forward转发引用
#include <tuple>
#include <memory>
#include <string>
template <typename ...Args>
struct Button
{
Button(const std::string& name, Args&& ...args) {
auto tuple_ = std::make_tuple<Args...>(std::forward<Args>(args)...);
}
};
template<template <typename ...Args> typename T1, typename ...Args>
void addObject(const std::string& name, Args&& ...args) {
auto obj = std::make_unique< T1 <Args...> >(name, std::forward<Args>(args)...);
//...rest of the code...
}
int main() {
addObject<Button>("BtnName", 0, 1, 2);
return 0;
}