if constexpr
- большой шаг для избавления от препроцессора в программах на С++. Однако он работает только в функциях, как в этом примере:
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";
}
Я (почти) уверен, что это соответствует спецификации С++ 17, что if constexpr
работает только внутри тел функции, но мои вопросы:
Q1 Как добиться аналогичного эффекта, например if-constexpr
в функциях - для класса и глобальной области действия в С++ 1z/С++ 14? И я не спрашиваю здесь еще одно объяснение специализации шаблонов... Но то, что имеет ту же простоту, что и if constexpr
...
Q2 Есть ли какой-либо план расширения С++ для вышеупомянутых областей?