是否可以构建具有不同类型的可变参数模板?

多夫

假设我有一个函数 write(ostream& s, T& val)

我可以在不同的数据上多次调用 write:

write(s, 5);
write(s, 2.5);
write(s, "abc");

相反,我想要一个可变参数列表,该列表将通过一次调用生成上述内容:

write(s, 5, 2.5, "abc");

我可以为单一类型做到这一点:

template<typename T, typename... Args>
void write(ostream& s, T first, Args... args) {
    write(s, first);
    write(s, args...);
}

有什么方法可以针对不同类型实现这一点吗?

最大66

有什么方法可以针对不同类型实现这一点吗?

完全按照您编写的方式工作。

但是,如果您可以使用 C++17,我建议避免递归并使用模板折叠如下

template <typename ... Args>
void write (std::ostream& s, Args ... args)
 { (..., write(s, args)); }

如果只能使用 C++11 或 C++14,则可以模拟模板折叠初始化未使用的数组

template <typename ... Args>
void write (std::ostream& s, Args ... args)
 {
   using unused = int[];

   (void)unused { 0, (write(s, args), 0)... };
 }

无论如何,你的递归方式的完整工作示例

#include <iostream>

template <typename T>
void write (std::ostream & s, T const & t)
 { s << "- " << t << std::endl; }

template <typename T, typename ... Args>
void write (std::ostream& s, T first, Args ... args)
 { write(s, first); write(s, args...); }

int main ()
 {
    write(std::cout, 1, 2.2, "three", 4l);
 }

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有相同类型参数的可变参数模板化函数

具有相同类型的可变参数模板参数的构造函数无法编译

具有依赖类型的c ++ 11可变参数函数模板是否不明确?

如何具有类型和大小的可变参数模板?

如何使用可变参数模板定义不同类型向量的向量?

具有不同类型的可变参数的宏

具有不同类型的模板非类型参数

有什么方法可以将成对的元组剥离为可变参数模板类型或实例化具有可变参数类型的对象?

如何创建可以处理具有不同类型参数的std :: set的模板类

是否可以调用静态方法形式的可变参数模板类型参数?

如何检查所有可变参数模板参数是否都具有特殊功能?

具有相同参数类型的可变参数模板函数

具有变化的返回类型的可变参数模板参数列表

是否可以修复可变参数模板函数的参数?

在C ++中可变参数模板中是否有对函数参数实施类型限制的好方法?

具有模板函数名称的可变参数模板

具有可变参数模板参数的函数指针

从具有可变参数模板构造函数的类型构造 std::function 对象

使用sfinae检测可变参数模板的基类是否具有特定方法

是否可以从函数模板返回可变参数的lambda?

在C ++ 14的可变参数模板中是否有一个优雅的解决方案可以在可调用类型和不可调用类型之间进行选择

具有不同类型参数的可变参数函数传递给它

是否可以使具有不同类型的多个参数的函数以任何顺序获取参数而不会重载?

返回具有不同模板参数值的不同类型(但类型相同)

具有const引用的可变参数模板

具有双打的C ++可变参数模板

C ++创建具有可变参数模板方法的接口

具有可变参数模板的成员函数指针

具有元组的C ++可变参数模板