X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fstrings%2Flexicalcast.h;h=80963f44dd3a233ff2d16b01ec007935d01e73c9;hp=c6a17da3491d053b6460399fddea6473ea1ca839;hb=ff0d3252cad08280b9c320b3fea5a11c80406c23;hpb=42ff7c629b2aa7411963bdcc2259a06b1d1de6d3 diff --git a/source/strings/lexicalcast.h b/source/strings/lexicalcast.h index c6a17da..80963f4 100644 --- a/source/strings/lexicalcast.h +++ b/source/strings/lexicalcast.h @@ -4,6 +4,7 @@ #include #include #include +#include #include "fmt.h" namespace Msp { @@ -89,7 +90,39 @@ void operator>>(const LexicalConverter &, std::string &); // Generic operators using stringstream template -void operator<<(LexicalConverter &c, const T &v) +struct HasFormattedOutput: Sfinae +{ + static std::ostream &s; + static T &v; + + /* The expression must depend on the template parameter, or the compiler + will give an error. */ + template + static Yes f(int (*)[sizeof(s<::v)]); + template + static No f(...); + + enum { value = Evaluate(0))>::value }; +}; + +template +struct HasFormattedInput: Sfinae +{ + static std::istream &s; + static T &v; + + template + static Yes f(int (*)[sizeof(s>>HasFormattedOutput::v)]); + template + static No f(...); + + enum { value = Evaluate(0))>::value }; +}; + + +template +typename EnableIf::value, void>::Yes +operator<<(LexicalConverter &c, const T &v) { std::ostringstream ss; ss< -void operator>>(const LexicalConverter &c, T &v) +typename EnableIf::value, void>::Yes +operator>>(const LexicalConverter &c, T &v) { std::istringstream ss(c.get()); ss.setf(std::ios_base::fmtflags(0), std::ios_base::skipws);