【发布时间】:2018-04-12 00:16:53
【问题描述】:
我有一种特殊的格式,它需要带有最终空终止符的空格分隔标记(空是输出的一部分)。我创建了一个函数来将一系列空格分隔的标记发送到输出流:
// C++ variadic template function to output tokens to a stream delimited by spaces
template <typename T>
void join(std::ostream& os, T const& arg)
{
// This is the last argument, so insert a null in the stream to delimit
os << arg << '\000';
}
// Join one, add a space, try again.
template <typename T, typename... Args>
void join(std::ostream& os, T const& arg, Args... args) // recursive variadic function
{
os << arg << " ";
join(os, args...);
}
这适用于join(os, 1, foo, "THING", M_PI); 之类的东西。但是,我也有一些不需要用空格分隔的标记,例如join(os, "KEY=", val);。
我尝试使用参数,想也许我可以在参数列表中填充一个nullptr 并使用它来重载方法,跳过空格,但我一生都无法弄清楚如何做到这一点有点过载。
我见过的大多数关于可变参数模板的问题都相当老了,在标准合规性更加普遍之前。如果这已在其他地方得到回答,请指出我。我正在使用 GCC 7.3。
或者,告诉我我把应该很简单的事情过于复杂化了。也许可变参数模板不是这个螺栓的正确锤子?
【问题讨论】:
-
他们有不同的行为,不要把他们塞进同一个函数里
标签: c++ c++11 templates c++14 variadic-templates