模板可变参数函数:任意数量的 类 和任意数量的构造函数参数

template variadic function: arbitrary number of classes with arbitrary number of constructor parameters

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

所以我们假设有任意数量的 classes k 和任意数量的参数 i 这取决于每个 class k构造函数。

我知道我可以使用可变模板构造任何 class k:

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

但是我想允许创建多个 class 类型, 类型不同 并且很可能具有不同的 Args。 此外,我想迭代正在构造的 classes k 。 沿线的东西:

template <typename T, typename... Classes, typename Args>
void make_classes(Classes... classes)
{
    for (auto type : classes) {
        make_class<T>(args...); //???
    }   
}
  1. 这可能吗?
  2. 如果不可能,是否有任何潜在的解决方法?
  3. 这样的 pattern/approach 有名字吗?这是parameter_pack吗?

抱歉,如果这是重复的。

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

大功告成,这个好写:

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.