Используя переопределяющий класс, оператор:
class VariadicToOutputStream
{
public:
VariadicToOutputStream(std::ostream& s, const std::string& separator = " ") : m_stream(s), m_hasEntries(false), m_separator(separator) {}
template<typename ObjectType>
VariadicToOutputStream& operator , (const ObjectType& v)
{
if (m_hasEntries) m_stream << m_separator;
m_stream << v;
m_hasEntries=true;
return *this;
}
~VariadicToOutputStream()
{
m_stream << std::endl;
}
private:
std::ostream& m_stream;
bool m_hasEntries;
std::string m_separator;
};
Вы можете написать, например:
VariadicToOutputStream(std::cout) , 1, 0.5f, "a string";
Затем можно обернуть макросом препроцессора:
#define VARIADIC_TO_STDOUT(...) VariadicToOutputStream(std::cout),__VA_ARGS__;
Итак, вы можете написать:
VARIADIC_TO_STDOUT(1, 0.5f, "a string");
Было бы легко добавить f.i. разделительные строки для использования между аргументами.
Редактировать: я просто добавил пробел по умолчанию в качестве разделительной строки.