Почти как настоящая вещь: -)
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
template<class L,class R>
struct cons_t
{
const L &l; const R &r;
cons_t(const L &_l, const R &_r) : l(_l),r(_r) {}
};
template<>
struct cons_t<void,void>{};
typedef cons_t<void,void> cons;
template<class L,class R,class A>
cons_t< cons_t<L,R>, A> operator , (const cons_t<L,R> &l, const A &arg)
{
return cons_t< cons_t<L,R>, A>(l,arg);
}
void to_stream(stringstream &s, const cons_t<void,void> &) { }
template<typename L, typename R>
void to_stream(stringstream &s, const cons_t<L,R> &c)
{
to_stream(s, c.l);
s << c.r;
}
template<typename L, typename R>
string to_string(const cons_t<L,R> &c)
{
stringstream ss;
to_stream(ss,c);
return ss.str();
}
#define ToString(...) to_string((cons(),__VA_ARGS__))
int main()
{
cout << ToString(1,2,"Hi There",3.14159);
}