#include #include #include // Can be stored as `const char` array with compile-time size for optimal use. const auto str = "Hello world."_frob; constexpr const char* str2 = "Hello world."_frob; // Can also be stored as normal `const char*` string constant pointer. const char* str3 = "Hello world."_frob; void assert_streq(const char* str, const char* str2) { if (strcmp(str,str2)!=0) { std::cerr << "Mismatch: '" << str << "' is not eq to '" << str2 << "'" << std::endl; std::terminate(); } } #define ASSERT_STREQ(ty, expr, get) do { ty _str = expr; assert_streq(_str get, str2); } while(0) int main() { char* str2 = strdup(str); memfrob(str2, strlen(str)); std::cout << str << std::endl; std::cout << str2 << std::endl; // test of frob::*frob() { ASSERT_STREQ(const auto, frob::strfrob(str), .c_str()); std::string frobbed = frob::strfrob((const char*)str2); constexpr const auto out = frob::strfrob<>("Hello world."); //for some reason it doesn't prefer the `constexpr` template overload, even in a constexpr context? auto out2 = frob::strfrob(out); std::cout << frobbed << std::endl; std::cout << out << std::endl; std::cout << out2 << std::endl; } free(str2); return 0; }