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

时间:2019-03-03 22:15:58

标签: c++ c++11 templates recursion variadic-templates

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

我可以多次调用写不同的数据:

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...);
}

对于不同的类型,有什么方法可以实现这一目标吗?

1 个答案:

答案 0 :(得分:3)

  

对于不同的类型,有什么方法可以实现这一目标吗?

与您编写的完全一样。

但是,如果可以使用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);
 }