像"if constexpr"之类的东西,但是用于类定义

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++?

不是.以下是所有提案,过去几年中没有一个提到这个领域.

而且他们不太可能.