Skip to content

Instantly share code, notes, and snippets.

@Zitrax
Created December 16, 2017 20:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Zitrax/608e17625e9df855475247ee450ca99e to your computer and use it in GitHub Desktop.
Save Zitrax/608e17625e9df855475247ee450ca99e to your computer and use it in GitHub Desktop.
string format with auto conversion of std::string
#include <string>
#include <iostream>
#include <memory>
template<typename T, typename U=T>
U convert(T&& t) {
return std::forward<T>(t);
}
const char* convert(const std::string& s) {
return s.c_str();
}
const char* convert(std::string& s) {
return s.c_str();
}
template<typename ... Args>
std::string stringFormatInternal(const std::string& format, Args&& ... args)
{
size_t size = snprintf(nullptr, 0, format.c_str(), std::forward<Args>(args) ...) + 1;
std::unique_ptr<char[]> buf(new char[size]);
snprintf(buf.get(), size, format.c_str(), args ...);
return std::string(buf.get(), buf.get() + size - 1);
}
template<typename ... Args>
std::string stringFormat(std::string fmt, Args&& ... args) {
return stringFormatInternal(fmt, convert(std::forward<Args>(args))...);
}
int main() {
std::string s = "ctest";
const std::string s2 = "test";
const char* cc = "uff";
std::cout << stringFormat("%s %s %s %s\n", s, s2, "a", cc);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment