#include <iostream>
#include <type_traits>
using namespace std;
struct Logger
{
// template<typename Type>
// using IsRawString =
// std::integral_constant<bool, std::is_same<const char*, Type>::value || std::is_same<char*, Type>::value>;
template<typename Type>
static constexpr bool IsRawString()
{
return std::is_same<const char*, Type>::value || std::is_same<char*, Type>::value;
}
template<typename Type, typename Enable = void> struct Traits;
template<typename Type>
struct Traits<Type, std::enable_if_t<!IsRawString<Type>() && !std::is_pointer<Type>::value>>
{
static const int Index = 1;
};
template<typename Type>
struct Traits<Type, std::enable_if_t<IsRawString<Type>()>>
{
static const int Index = 2;
};
template<typename Type>
struct Traits<Type, std::enable_if_t<std::is_pointer<Type>::value && !IsRawString<Type>()>>
{
static const int Index = 3;
};
};
int main()
{
cout << Logger::Traits<int>::Index << endl
<< Logger::Traits<char*>::Index << endl
<< Logger::Traits<const char*>::Index << endl
<< Logger::Traits<void*>::Index << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IExvZ2dlcgp7Ci8vICAgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+Ci8vICAgIHVzaW5nIElzUmF3U3RyaW5nID0KLy8gICAgICAgIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgc3RkOjppc19zYW1lPGNvbnN0IGNoYXIqLCBUeXBlPjo6dmFsdWUgfHwgc3RkOjppc19zYW1lPGNoYXIqLCBUeXBlPjo6dmFsdWU+OwoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+CiAgICBzdGF0aWMgY29uc3RleHByIGJvb2wgSXNSYXdTdHJpbmcoKQogICAgewogICAgICAgIHJldHVybiBzdGQ6OmlzX3NhbWU8Y29uc3QgY2hhciosIFR5cGU+Ojp2YWx1ZSB8fCBzdGQ6OmlzX3NhbWU8Y2hhciosIFR5cGU+Ojp2YWx1ZTsKICAgIH0KCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlLCB0eXBlbmFtZSBFbmFibGUgPSB2b2lkPiBzdHJ1Y3QgVHJhaXRzOwoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+CiAgICBzdHJ1Y3QgVHJhaXRzPFR5cGUsIHN0ZDo6ZW5hYmxlX2lmX3Q8IUlzUmF3U3RyaW5nPFR5cGU+KCkgJiYgIXN0ZDo6aXNfcG9pbnRlcjxUeXBlPjo6dmFsdWU+PgogICAgewogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgSW5kZXggPSAxOwogICAgfTsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPgogICAgc3RydWN0IFRyYWl0czxUeXBlLCBzdGQ6OmVuYWJsZV9pZl90PElzUmF3U3RyaW5nPFR5cGU+KCk+PgogICAgewogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgSW5kZXggPSAyOwogICAgfTsKCiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPgogICAgc3RydWN0IFRyYWl0czxUeXBlLCBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfcG9pbnRlcjxUeXBlPjo6dmFsdWUgJiYgIUlzUmF3U3RyaW5nPFR5cGU+KCk+PgogICAgewogICAgICAgIHN0YXRpYyBjb25zdCBpbnQgSW5kZXggPSAzOwogICAgfTsKCn07CgppbnQgbWFpbigpCnsKICAgIGNvdXQgPDwgTG9nZ2VyOjpUcmFpdHM8aW50Pjo6SW5kZXggPDwgZW5kbAogICAgICAgICA8PCBMb2dnZXI6OlRyYWl0czxjaGFyKj46OkluZGV4IDw8IGVuZGwKICAgICAgICAgPDwgTG9nZ2VyOjpUcmFpdHM8Y29uc3QgY2hhcio+OjpJbmRleCA8PCBlbmRsCiAgICAgICAgIDw8IExvZ2dlcjo6VHJhaXRzPHZvaWQqPjo6SW5kZXggPDwgZW5kbDsKCgogICAgcmV0dXJuIDA7Cn0=