Pio*_*ycz 12 c++ class c-preprocessor c++17 if-constexpr
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";
}
}
Run Code Online (Sandbox Code Playgroud)
但是关于摆脱预处理器的梦想并不十分满意 - 因为以下示例不能编译:
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";
}
};
Run Code Online (Sandbox Code Playgroud)
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";
}
Run Code Online (Sandbox Code Playgroud)
我(几乎)确定这是按照C++ 17规范if constexpr只在函数体内工作 - 但我的问题是:
Q1如何if-constexpr在函数中实现类似的效果- 对于C++ 1z/C++ 14中的类和全局范围?我并不是在这里要求对模板专业化的另一种解释......但是有一些类似简单的东西if constexpr......
Q2是否有计划为上述范围扩展C++?
Nic*_*las 13
如何在函数中实现类似if-constexpr的效果 - 对于C++ 1z/C++ 14中的类和全局范围?我不是在这里要求对模板专业化的另一种解释......
你基本上只是说,"我想要模板专业化,但没有那种讨厌的模板专业化."
if constexpr是基于编译时结构使函数行为发生变化的工具.模板专门化是C++提供的工具,用于根据编译时结构更改定义.它是C++为此功能提供的唯一工具.
现在,为了简化初始化变量的情况,您始终可以创建并调用lambda.C++ 17提供constexpr对lambdas的支持,lambda可以if constexpr用来决定返回什么值.
有没有计划为上述范围扩展C++?
不是.以下是所有提案,过去几年中没有一个提到这个领域.
而且他们不太可能.