Проблема, с которой вы столкнулись, связана с тем, что operator << (ostream&, char*)
не является членом ostream, и ваш временный экземпляр ostream не может связываться с не-1002 * ссылкой. Вместо этого он выбирает перегрузку void*
, которая является членом ostream, и поэтому не имеет этого ограничения.
Лучшее (но не самое простое и не самое элегантное из всех возможных представлений!) Использование препроцессора Boost для генерации большого числа перегрузок функций, каждый из которых основан на большом количестве объектов (включения были опущены и при условии using namespace std;
):
#define MAKE_OUTPUT(z, n, data) \
BOOST_PP_TUPLE_ELEM(2, 0, data) << BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 1, data), n);
#define MAKE_FORMAT(z, n, data) \
template <BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(n), typename T)> \
inline string format(BOOST_PP_ENUM_BINARY_PARAMS_Z(z, BOOST_PP_INC(n), T, p)) \
{ \
ostringstream s; \
BOOST_PP_REPEAT_##z(z, n, MAKE_OUTPUT, (s, p)); \
return s.str(); \
}
Это не гарантированно работает точно (написал это без тестирования), но это в основном идея. Затем вы вызываете BOOST_PP_REPEAT(N, MAKE_FORMAT, ())
, чтобы создать ряд функций, принимающих до N параметров, которые будут форматировать вашу строку так, как вы хотите (замените N целым числом выбора. Более высокие значения могут отрицательно повлиять на время компиляции). Этого должно быть достаточно, пока вы не получите компилятор с переменными шаблонами. Вам следует прочитать документацию по препроцессору boost, он обладает очень мощными возможностями для подобных вещей. (вы можете впоследствии #undef
макросы после вызова BOOST_PP_REPEAT
вызова для генерации функций)