如何将可变参数从一个模板传递到另一个模板

How to pass variadic parameters from one template to another

我有这个代码:

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

但是,编译时不会出现 "error LNK2019: unresolved external symbol..." 或 "no matching function for call to 'addObject class Button>(const char [8], int, int, int)'" 之类的错误。如果我们评论 "addObject" 函数,它编译得很好。

如何以正确的方式将参数传递给另一个模板?

Button 是一个 class 模板;在 addObject<Button>("BtnName", 0, 1, 2); 中使用它时,您必须为其指定模板参数,如 Button<...some arguments...>.

除了上面的解决方案,也许你想将模板参数 Args 从 class 移动到 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)...);
    }
};

LIVE


其他问题:

  • Button的构造函数是private
  • 没有#include <string>

您可以创建一个具有模板模板类型参数的模板,这样您就不必指定参数类型,如下所示

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