Препроцессор работает перед компилятором C ++.Он ничего не знает о типах C ++;только токены препроцессора.
Хотя я и ожидал, что любой приличный компилятор оптимизирует if (sizeof(T) == 1)
, вы можете быть откровенны в C ++ 17 с новым if constexpr
:
template<typename T>
class String
{
public:
static void showSize()
{
if constexpr (sizeof(T) == 1) {
std::cout << "char\n";
} else {
std::cout << "wchar_t\n";
}
}
};
Live Demo
Pre C ++ 17 это немного менее просто.Вы можете использовать некоторые махинации с частичной специализацией.Это не особенно красиво, и я не думаю, что это будет даже более эффективно в этом случае, но тот же шаблон может быть применен в других ситуациях:
template <typename T, size_t = sizeof(T)>
struct size_shower
{
static void showSize()
{
std::cout << "wchar_t\n";
}
};
template <typename T>
struct size_shower<T, 1>
{
static void showSize()
{
std::cout << "char\n";
}
};
template<typename T>
class String
{
public:
static void showSize()
{
size_shower<T>::showSize();
}
};
Live Demo
В этом случае вы могли бы напрямую специализироваться String
, но я предполагаю, что в вашей реальной ситуации есть другие участники, которые вам не нужно повторять.