Да, добавьте манипулятор (ы), который вы хотите к сигнатуре функции, и переместите их в поток.
template<typename T, typename Manip>
std::string Stringify(T const &value, Manip manip)
{
std::stringstream ss;
ss << manip << value;
return ss.str();
}
С образцом кода;
int main()
{
using namespace std;
// The precision here is set to be sufficient to print the test platform
cout << Stringify(numeric_limits<float>::max(), setprecision(50)) << endl;
}
Я полагаю, что более чем один манипулятор будет использоваться. С этой целью можно добавить функциональные перегрузки для необходимого количества манипуляторов или использовать (с C++ 11) вариативные шаблоны и совершенную пересылку.
template <typename Stream>
Stream& AddManip(Stream& str)
{
// end the recursion
return str;
}
template <typename Stream, typename Head, typename... Tails>
Stream& AddManip(Stream& str, Head&& head, Tails&&... tails)
{
// add the head manipulator and forward the rest
str << std::forward<Head>(head);
return AddManip(str, std::forward<Tails>(tails)...);
}
template<typename T, typename... Manip>
std::string Stringify(T const &value, Manip&&... manip)
{
std::stringstream ss;
// add the manipulators to the stream
AddManip(ss, std::forward<Manip>(manip)...);
ss << value;
return ss.str();
}
int main()
{
using namespace std;
cout << Stringify(numeric_limits<int>::max(), setprecision(40), std::hex) << endl;
}
use 'std :: fixed' – Sneftel
Вы ищете' setprecision'? @Sneftel Это не обрабатывается, например, 0,0000001. –
@ T.C. Моя первоначальная мысль заключалась в том, чтобы использовать его, но тогда проблема «setprecision» на что? Я имею в виду, что это должно быть динамическим и самонастраивающимся. –