我不确定正确的名称是什么,到目前为止,我理解使用可变参数模板参数的概念(例如,与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...); //???
}
}
parameter_pack
?如果这是重复的话,请道歉。
答案 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));
请注意make_from_tuple
是一个C ++ 17库添加;如果您的图书馆没有,您可以复制example implementation。