#include <iostream>
#include <type_traits>
class C
{
private:
class integral {};
class floatingpoint {};
class cstring {};
template<bool sw, typename T1, typename T2>
using Sel = typename std::conditional<sw, T1, T2>::type;
template<typename T>
using Sel2 = Sel<std::is_convertible<T, char const*>::value, cstring, void>;
template<typename T>
using Sel1 = Sel<std::is_floating_point<T>::value, floatingpoint, Sel2<T>>;
template<typename T>
using SelectOverload = Sel<std::is_integral<T>::value, integral, Sel1<T>>;
public:
template<typename T, typename Overload = SelectOverload<T>>
explicit C(T&& value)
{
init(std::forward<T>(value), Overload());
}
private:
template<typename T>
void init(T&& value, integral)
{
std::cout << "integral" << std::endl;
}
template<typename T>
void init(T&& value, floatingpoint)
{
std::cout << "floating point" << std::endl;
}
template<typename T>
void init(T&& value, cstring)
{
std::cout << "cstring" << std::endl;
}
};
int main()
{
C z(0);
C a(1);
C b(1.0);
C c("");
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CgpjbGFzcyBDCnsKcHJpdmF0ZToKICAgIGNsYXNzIGludGVncmFsIHt9OwogICAgY2xhc3MgZmxvYXRpbmdwb2ludCB7fTsKICAgIGNsYXNzIGNzdHJpbmcge307CgogICAgdGVtcGxhdGU8Ym9vbCBzdywgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgogICAgdXNpbmcgU2VsID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzdywgVDEsIFQyPjo6dHlwZTsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgdXNpbmcgU2VsMiA9IFNlbDxzdGQ6OmlzX2NvbnZlcnRpYmxlPFQsIGNoYXIgY29uc3QqPjo6dmFsdWUsIGNzdHJpbmcsIHZvaWQ+OwogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHVzaW5nIFNlbDEgPSBTZWw8c3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUsIGZsb2F0aW5ncG9pbnQsIFNlbDI8VD4+OwogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHVzaW5nIFNlbGVjdE92ZXJsb2FkID0gU2VsPHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlLCBpbnRlZ3JhbCwgU2VsMTxUPj47CgpwdWJsaWM6CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBPdmVybG9hZCA9IFNlbGVjdE92ZXJsb2FkPFQ+PgogICAgZXhwbGljaXQgQyhUJiYgdmFsdWUpCiAgICB7CiAgICAgICAgaW5pdChzdGQ6OmZvcndhcmQ8VD4odmFsdWUpLCBPdmVybG9hZCgpKTsKICAgIH0KCnByaXZhdGU6ICAgIAogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHZvaWQgaW5pdChUJiYgdmFsdWUsIGludGVncmFsKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiaW50ZWdyYWwiIDw8IHN0ZDo6ZW5kbDsKICAgIH0KICAgIAogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHZvaWQgaW5pdChUJiYgdmFsdWUsIGZsb2F0aW5ncG9pbnQpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJmbG9hdGluZyBwb2ludCIgPDwgc3RkOjplbmRsOwogICAgfQogICAgCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgdm9pZCBpbml0KFQmJiB2YWx1ZSwgY3N0cmluZykKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgImNzdHJpbmciIDw8IHN0ZDo6ZW5kbDsKICAgIH0KfTsKCmludCBtYWluKCkKewogICAgQyB6KDApOwogICAgQyBhKDEpOwogICAgQyBiKDEuMCk7CiAgICBDIGMoIiIpOwp9Cg==