nsf gamedevЖурнал

Пользовательские литералы в С++11

Автор:

Совсем маленький, возможно абсолютно бесполезный пример. Просто пришло в голову, решил записать куда-то.

#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 было лень, поэтому так.

#С++11

3 марта 2013