Domanda

How can I make boost::lexical_cast include a positive sign when converting to std::string?

I intend to do the same as: snprintf( someArray, someSize, "My string which needs sign %+d", someDigit );. Here, someDigit would be put in the string as +someDigit if it were positive, or -someDigit if it were negative. See: http://www.cplusplus.com/reference/clibrary/cstdio/snprintf/

È stato utile?

Soluzione

How can I make boost::lexical_cast include a positive sign when converting to std::string?

There is no way to control the formatting of built-in types when using boost::lexical_cast<>.

boost::lexical_cast<> uses streams to do the formatting. Hence, one can create a new class and overload operator<< for it and boost::lexical_cast<> will use that overloaded operator to format values of the class:

#include <boost/lexical_cast.hpp>
#include <iomanip>
#include <iostream>

template<class T> struct ShowSign { T value; };

template<class T>
std::ostream& operator<<(std::ostream& s, ShowSign<T> wrapper) {
    return s << std::showpos << wrapper.value;
}

template<class T>
inline ShowSign<T> show_sign(T value) {
    ShowSign<T> wrapper = { value };
    return wrapper;
}

int main() {
    std::string a = boost::lexical_cast<std::string>(show_sign(1));
    std::cout << a << '\n';
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top