X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fstrings%2Flexicalcast.h;h=13eab45f0b81c9311381f43f880caf2abb5fcf5b;hp=25e3268126bde5d65cf19dca35d188c96dcebb5e;hb=e83bcaa01b98b600171886ff6b06d884385dd0ed;hpb=468ec9f6554c89b52e10a280411c9b9d99ef451b diff --git a/source/strings/lexicalcast.h b/source/strings/lexicalcast.h index 25e3268..13eab45 100644 --- a/source/strings/lexicalcast.h +++ b/source/strings/lexicalcast.h @@ -10,7 +10,7 @@ namespace Msp { /** -Thrown for errors in lexical conversions +Thrown for errors in lexical conversions. */ class lexical_error: public std::runtime_error { @@ -20,6 +20,9 @@ public: }; +/** +Thrown when the format is unsuitable for the type being converted. +*/ class format_mismatch: public lexical_error { public: @@ -90,36 +93,25 @@ void operator>>(const LexicalConverter &, std::string &); // Generic operators using stringstream -template -struct HasFormattedOutput: Sfinae +struct CheckFormattedOutput: 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 + static Yes f(int (*)[sizeof(s< -struct HasFormattedInput: Sfinae +struct CheckFormattedInput: 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 + static Yes f(int (*)[sizeof(s>>reinterpret_cast(s))]); + using Sfinae::f; }; +template struct HasFormattedOutput: Sfinae::Evaluate { }; +template struct HasFormattedInput: Sfinae::Evaluate { }; + template typename EnableIf::value, void>::Yes @@ -141,8 +133,9 @@ operator>>(const LexicalConverter &c, T &v) throw lexical_error("conversion failure"); } -// Helper struct to provide partial template specialization - +/** +Helper struct to provide partial template specialization. +*/ template struct LexicalCast; @@ -180,8 +173,10 @@ struct LexicalCast } }; -// The main interface to the lexical conversion machinery - +/** Perform a lexical conversion between a string and another type. The source +type can normally be deduced by the compiler, so this can be used just like the +standard C++ casts. A format may additionally be specified to force a specific +interpretation. */ template inline T lexical_cast(const F &v, const Fmt &f = Fmt()) {