#include <iostream>
#include <string>
#include <vector>
template <int I> struct choice : choice<I+1> {
void func() { std::cout << "choice<" << I << "> - "; }
};
template <> struct choice<10> {
void func() { std::cout << "choice<10>, yo! - "; }
};
// arithmetic version
template <class T>
auto convertToStringHelper(T const& t, choice<0> c)
-> decltype(std::to_string(t))
{
c.func();
return std::to_string(t) + '\n';
}
// non-arithmetic version
template <class T>
auto convertToStringHelper(T const& t, choice<1> c)
-> decltype(std::string(t))
{
c.func();
return std::string(t) + '\n';
}
// vector version
template <class T, class A>
std::string convertToStringHelper(std::vector<T,A> const& v, choice<2> c)
{
c.func();
// implementation here
return "";
}
template <class T>
std::string convertToString(T const& t) {
return convertToStringHelper(t, choice<0>{});
}
int main() {
std::cout << convertToString('A');
std::cout << convertToString("A");
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPGludCBJPiBzdHJ1Y3QgY2hvaWNlIDogY2hvaWNlPEkrMT4gewogICAgdm9pZCBmdW5jKCkgeyBzdGQ6OmNvdXQgPDwgImNob2ljZTwiIDw8IEkgPDwgIj4gLSAiOyB9Cn07CnRlbXBsYXRlIDw+IHN0cnVjdCBjaG9pY2U8MTA+IHsKICAgIHZvaWQgZnVuYygpIHsgc3RkOjpjb3V0IDw8ICJjaG9pY2U8MTA+LCB5byEgLSAiOyB9Cn07CgovLyBhcml0aG1ldGljIHZlcnNpb24KdGVtcGxhdGUgPGNsYXNzIFQ+CmF1dG8gY29udmVydFRvU3RyaW5nSGVscGVyKFQgY29uc3QmIHQsIGNob2ljZTwwPiBjKQogICAgLT4gZGVjbHR5cGUoc3RkOjp0b19zdHJpbmcodCkpCnsKCWMuZnVuYygpOwogICAgcmV0dXJuIHN0ZDo6dG9fc3RyaW5nKHQpICsgJ1xuJzsKfQoKLy8gbm9uLWFyaXRobWV0aWMgdmVyc2lvbgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KYXV0byBjb252ZXJ0VG9TdHJpbmdIZWxwZXIoVCBjb25zdCYgdCwgY2hvaWNlPDE+IGMpCiAgICAtPiBkZWNsdHlwZShzdGQ6OnN0cmluZyh0KSkKewoJYy5mdW5jKCk7CiAgICByZXR1cm4gc3RkOjpzdHJpbmcodCkgKyAnXG4nOwp9CgovLyB2ZWN0b3IgdmVyc2lvbgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQT4Kc3RkOjpzdHJpbmcgY29udmVydFRvU3RyaW5nSGVscGVyKHN0ZDo6dmVjdG9yPFQsQT4gY29uc3QmIHYsIGNob2ljZTwyPiBjKQp7CgljLmZ1bmMoKTsKICAgIC8vIGltcGxlbWVudGF0aW9uIGhlcmUKICAgIHJldHVybiAiIjsKfQoKdGVtcGxhdGUgPGNsYXNzIFQ+CnN0ZDo6c3RyaW5nIGNvbnZlcnRUb1N0cmluZyhUIGNvbnN0JiB0KSB7CiAgICByZXR1cm4gY29udmVydFRvU3RyaW5nSGVscGVyKHQsIGNob2ljZTwwPnt9KTsKfQoKaW50IG1haW4oKSB7CiAgICBzdGQ6OmNvdXQgPDwgY29udmVydFRvU3RyaW5nKCdBJyk7CiAgICBzdGQ6OmNvdXQgPDwgY29udmVydFRvU3RyaW5nKCJBIik7Cn0=