模板可变参数函数:任意数量的 类 和任意数量的构造函数参数
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...); //???
}
}
- 这可能吗?
- 如果不可能,是否有任何潜在的解决方法?
- 这样的 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));
注意make_from_tuple
是一个C++17库添加;如果您的图书馆没有,您可以复制 example implementation.
我不确定正确的名称是什么,到目前为止我理解使用可变参数模板参数的概念(例如,与 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...); //???
}
}
- 这可能吗?
- 如果不可能,是否有任何潜在的解决方法?
- 这样的 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));
注意make_from_tuple
是一个C++17库添加;如果您的图书馆没有,您可以复制 example implementation.