首页 > 解决方案 > 如何将可变参数从一个模板传递到另一个模板

问题描述

我有这个代码:

#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 传递给另一个模板?

标签: c++templatesc++17variadic-templates

解决方案


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

居住


其他问题:

  • 的构造函数Buttonprivate
  • 没有#include <string>

推荐阅读