是否可以调整常见的C++字符串化方法:

template<typename T>
std::string Stringify(T const &value)
{
    std::stringstream ss;
    ss << value;
    return ss.str();
}

因此将打印出实际值,而不是该值的截断或科学计数法表示形式,例如:
std::cout << Stringify(std::numeric_limits<float>::max()) << std::endl;

不应打印3.40282e+38,而应打印3'402'82...(我只是不提及其余数字,我并不是在暗示应打印点)

最佳答案

是的,将所需的操纵器添加到函数签名并将其转发到流。

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;
}

关于c++ - 逐字串化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32605361/

10-09 06:00