模板variadic函数:具有任意数量的构造函数参数的任意数量的类

时间:2016-08-26 14:05:20

标签: c++ variadic-templates variadic-functions

我不确定正确的名称是什么,到目前为止,我理解使用可变参数模板参数的概念(例如,与std::initializer_list相比)。

因此,我们假设有任意数量的类k和任意数量的参数i,它们依赖于每个类k构造函数。

我知道我可以使用可变参数模板构建任何类k

template <typename T, typename... Args>
void make_class(Args... args)
{
    auto k = T(args...);
}

但是我想允许创建多个类不是同一类型,并且很可能有不同的Args。 此外,我想迭代正在构造的类k。 一些事情:

template <typename T, typename... Classes, typename Args>
void make_classes(Classes... classes)
{
    for (auto type : classes) {
        make_class<T>(args...); //???
    }   
}
  1. 这可能吗?
  2. 如果不可能,是否有任何潜在的解决方法?
  3. 这种模式/方法有名称吗?这是parameter_pack
  4. 如果这是重复的话,请道歉。

1 个答案:

答案 0 :(得分:2)

您需要通过在元组中传递它们来描述每个类的参数,否则对于具有多个构造函数的类,结果可能是不明确的(并注意大多数类至少具有默认构造函数和复制构造函数) )。

完成后,这很容易写:

template<class... Classes, class... Args>
void make_classes(Args&&... args) {
    auto k = std::tuple<Classes...>{
        std::make_from_tuple<Classes>(std::forward<Args>(args))...};
}

用法:

make_classes<std::pair<int, float>, std::string, std::vector<double>>(
    std::forward_as_tuple(42, 3.14f),
    std::forward_as_tuple("hello"),
    std::forward_as_tuple(5, 99.99));

Example

请注意make_from_tuple是一个C ++ 17库添加;如果您的图书馆没有,您可以复制example implementation