Пользовательские литералы в С++11
Автор: nsf
Совсем маленький, возможно абсолютно бесполезный пример. Просто пришло в голову, решил записать куда-то.
#include <string> #include <cstdio> #include <cstddef> class formatter { const char *format; public: explicit formatter(const char *format): format( format) {} template <typename ...Args> std::string operator( )( Args ...args) { char tmp[4096]; size_t n = std::snprintf( tmp, sizeof( tmp), format, args...); return {tmp, n}; } }; formatter operator "" _fmt( const char *format, size_t) { return formatter( format); } int main( int argc, char **argv) { std::string s = "hello, %s"_fmt( "nsf"); std::string s2 = "%d + %d = %d"_fmt( 1, 2, 3); std::printf( "%s\n", s.c_str( )); std::printf( "%s\n", s2.c_str( )); return 0; }
Стоит отметить, что возможно лучше использовать variadic функцию вместо variadic шаблона - меньше кода компилятор будет генерировать. Но вспоминать va_start/va_end и va_list было лень, поэтому так.
3 марта 2013