Zha*_*ang -4 c++ preprocessor-directive
我想使用预处理器命令来控制代码执行路径。因为这样可以节省运行时间。
#if (sizeof(T)==1 不符合错误:C1017
template<typename T>
class String
{
public:
static void showSize()
{
#if (sizeof(T)==1)
cout << "char\n";
#else
cout << "wchar_t\n";
#endif
}
};
inline void test()
{
String<char>::showSize();
String<wchar_t>::showSize();
}
Run Code Online (Sandbox Code Playgroud)
预处理程序在C ++编译器之前运行。它对C ++类型一无所知。仅预处理器令牌。
虽然我希望任何不错的编译器都能优化an 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";
}
}
};
Run Code Online (Sandbox Code Playgroud)
在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();
}
};
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以直接进行专长研究String,但是我假设在您的实际情况下,它有其他成员您不想重复。