Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将可变参数从一个模板传递到另一个模板_C++_Templates_C++17_Variadic Templates - Fatal编程技术网

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;
}