使用来自 std::vector 的参数调用可变参数模板化函数

立方体

我需要将 std::vector 的元素转换为基于模板参数的类型,并使用这些参数调用函数。在伪代码中:

template <typename T...>
void foo(std::vector<std::string> v) {
    if (v.size() != sizeof...(T))
        throw std::runtime_error("Bad");

    bar(convert<T0>(v[0]), convert<T1>(v[1]), ..., convert<Tn>(v[n]));
}

我的问题是如何从参数包中获取元素索引,我认为使用折叠表达式会有某种技巧,但我无法弄清楚。

平均

如果你知道一个向量中的元素个数等于参数包的大小,你可以通过增加一层间接来解决这个问题:

template<typename... T, std::size_t... is>
void foo_impl(const std::vector<std::string>& v, std::index_sequence<is...>) {
    bar(convert<T>(v[is])...);
}


template<typename... T>
void foo(const std::vector<std::string>& v) {
    assert(v.size() == sizeof...(T));
    foo_impl<T...>(v, std::index_sequence_for<T...>{});
}

这里的想法是同时展开两个大小相同的Ts...is...


C++20解决方案:

template<typename... T>
void foo(const std::vector<std::string>& v) {
    assert(v.size() == sizeof...(T));

    [&v]<std::size_t... is>(std::index_sequence<is...>) {
        bar(convert<T>(v[is])...);
    }(std::index_sequence_for<T...>{});
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

来自整数的可变参数模板参数

在可变参数模板中使用std :: placeholders

使用来自外部类的可变参数模板的args部分精化可变参数模板内部类是否合法

函数指针的std :: vector:不同的模板参数

对可变参数模板结构使用std :: visit

使用可变参数模板构建函数参数

如何使用可变参数模板使用std :: function

可变参数模板函数:没有匹配的调用函数,std :: endl

使用来专门化可变参数模板

使用std :: function作为参数的可变参数模板

多维std :: array的可变参数模板

在可变参数模板中使用std :: bind完美转发引用

使用std :: bind和std :: placeholders的可变参数模板工厂

如何使用可变参数模板参数进行模板函数调用?

使用可变参数模板化助手进行多个std :: variant访问

为什么不能使用模板模板参数将std :: vector <MyType>传递给此函数?

如何使用可变参数模板将std :: variant与std :: visit一起进行?

如果可能的话,如何使用可变参数模板制作一个可以并排打印多个std :: vector的函数?

从可变参数模板数组引用构造函数初始化双嵌套std :: array

std :: vector初始化的模板参数

获取std :: vector的大小(通过扩展可变参数模板函数,使其仅与参数类型一起使用以与参数一起使用)

std :: function的可变参数模板参数

使用带有模板参数的swap与std :: vector include冲突

std :: function到可变参数成员函数,然后绑定可变参数模板参数

无法将std :: bind与可变参数模板参数一起使用

使用成员函数调用可变参数模板函数

如何使用 std::vector 动态实例化具有参数化构造函数的类?

使用可变参数类模板的模板参数调用可变参数函数模板?

std::invoke 不喜欢可变参数模板成员函数?