#include <iostream>
namespace Implementation
{
using Preferred = int;
using Fallback = char;
template <std::size_t Size>
void String(Preferred, const char (&string)[Size])
{
std::cout << "Constant string" << std::endl;
}
void String(Fallback, const char* string)
{
std::cout << "Non-constant string" << std::endl;
}
}
template <typename T>
void String(const T& string)
{
Implementation::String(0, string);
}
int main(int argc, char* argv[])
{
String("Test"); // Detects constant string
String(argv[0]); // Detects non-constant string
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKbmFtZXNwYWNlIEltcGxlbWVudGF0aW9uCnsKCXVzaW5nIFByZWZlcnJlZCA9IGludDsKCXVzaW5nIEZhbGxiYWNrID0gY2hhcjsKCQoJdGVtcGxhdGUgPHN0ZDo6c2l6ZV90IFNpemU+Cgl2b2lkIFN0cmluZyhQcmVmZXJyZWQsIGNvbnN0IGNoYXIgKCZzdHJpbmcpW1NpemVdKQoJewoJCXN0ZDo6Y291dCA8PCAiQ29uc3RhbnQgc3RyaW5nIiA8PCBzdGQ6OmVuZGw7Cgl9CgkKCXZvaWQgU3RyaW5nKEZhbGxiYWNrLCBjb25zdCBjaGFyKiBzdHJpbmcpCgl7CgkJc3RkOjpjb3V0IDw8ICJOb24tY29uc3RhbnQgc3RyaW5nIiA8PCBzdGQ6OmVuZGw7Cgl9Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIFN0cmluZyhjb25zdCBUJiBzdHJpbmcpCnsKCUltcGxlbWVudGF0aW9uOjpTdHJpbmcoMCwgc3RyaW5nKTsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgCnsKCVN0cmluZygiVGVzdCIpOyAvLyBEZXRlY3RzIGNvbnN0YW50IHN0cmluZwoJU3RyaW5nKGFyZ3ZbMF0pOyAvLyBEZXRlY3RzIG5vbi1jb25zdGFudCBzdHJpbmcKfQ==