【发布时间】:2021-07-12 22:24:23
【问题描述】:
我有以下函数模板:
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
#include <iostream>
#include <string>
#include <vector>
template <typename Streamable>
void printall(std::vector<Streamable>& items, std::string sep = "\n")
{
for (Streamable item : items)
std::cout << item << sep;
}
#endif
现在我想将sep 的默认值设置为std::endl,这是一个函数,而不是std::string。
但我也希望用户能够传入std::string。
我必须如何指定参数sep 的类型以同时接受任意std::string 和std::endl?
【问题讨论】:
-
您应该使用与
std::endl声明中使用的相同类型。但是,您所拥有的实施究竟让您感到困扰的是什么?!? -
std::endl是一个函数,它输出\n,然后在流上调用flush()。为什么要在每个项目之后刷新?如果你想刷新,在循环之后执行一次是有意义的。 -
如果你坚持:
template <typename Streamable, typename Sep = decltype(std::endl<char, std::char_traits<char>>)> void printall(std::vector<Streamable>& items, Sep sep = std::endl)Demo。这接受任何可以写入std::cout(不仅仅是字符串和std::endl)的分隔符 -
谢谢。我读了这个,因为它只能通过扩展模板来工作。现在我确信,我不想那样做。
-
你也可以写两个重载,一个接受一个参数并使用
std::endl,一个接受两个参数,第二个是std::string,没有默认参数。
标签: c++ string types c++17 endl