if constexpr
是摆脱 C++ 程序中的预处理器的一大步。但是它只在函数中起作用——就像在这个例子中:
enum class OS
{
Linux,
MacOs,
MsWindows,
Unknown
};
#if defined(__APPLE__)
constexpr OS os = OS::MacOs;
#elif defined(__MINGW32__)
constexpr OS os = OS::MsWindows;
#elif defined(__linux__)
constexpr OS os = OS::Linux;
#else
constexpr OS os = OS::Unknown;
#endif
void printSystem()
{
if constexpr (os == OS::Linux)
{
std::cout << "Linux";
}
else if constexpr (os == OS::MacOs)
{
std::cout << "MacOS";
}
else if constexpr (os == OS::MsWindows)
{
std::cout << "MS Windows";
}
else
{
std::cout << "Unknown-OS";
}
}
但是摆脱预处理器的梦想并不十分满足——因为以下示例无法编译:
1不能在类定义中使用它来不同地定义类的某些成员:
class OsProperties
{
public:
static void printName()
{
std::cout << osName;
}
private:
if constexpr (os == OS::Linux)
{
const char* const osName = "Linux";
}
else if constexpr (os == OS::MacOs)
{
const char* const osName = "MacOS";
}
else if constexpr (os == OS::MsWindows)
{
const char* const osName = "MS Windows";
}
else
{
const char* const osName = "Unknown";
}
};
2它也不适用于非类范围(如全局范围):
if constexpr (os == OS::Linux)
{
const char* const osName = "Linux";
}
else if constexpr (os == OS::MacOs)
{
const char* const osName = "MacOS";
}
else if constexpr (os == OS::MsWindows)
{
const char* const osName = "MS Windows";
}
else
{
const char* const osName = "Unknown";
}
我(几乎)确定这符合 C++17 规范,if constexpr
仅适用于函数体 - 但我的问题是:
Q1如何在 C++1z/C++14 中实现类和全局作用域类似的效果if-constexpr
?而且我不是在这里要求对模板专业化的另一种解释...但是具有与if constexpr
...类似的简单性的东西
Q2是否有针对上述范围扩展 C++ 的计划?