Я пытаюсь заменить препроцессор #define и # if / # ifdef, которые я использую для управления условной компиляцией с переменными constexpr и ifs.
Можно ли объявить переменные constexpr так, чтобы они воспроизводили# определяет, что они не выделяют хранилище времени выполнения и что получение адреса одного приводит к ошибке времени компиляции?
Отредактировано для добавления примера кода.
Так что в заголовках я хочуиметь что-то вроде
namespace ExampleNamespace
{
enum class Platform : int {Darwin, Linux, Windows};
constexpr Platform BuildPlatform = Platform::Darwin; // Line A.
};
В то время как в коде я хочу
if constexpr (Platform::Darwin == BuildPlatform) // Line B.
{
cout << "Platform is Darwin" << endl;
}
else
{
cout << "Platform is not Darwin" << endl;
};
const Platform *const PlatformAddress = &BuildPlatform; // Line C.
const Platform &BuildPlatform2 = BuildPlatform; // Line D.
Тогда цель состоит в том, чтобы затем изменить определение BuildPlatform в строке A, чтобы строка B вычислялась при компиляцииtime (и предложение else отбрасывается / не компилируется), а строки C и D (и все, что делает то же самое или полагается на хранилище времени выполнения для BuildPlatform) генерирует ошибку компилятора.
Возможна ли такая конструкцияв С ++ 17?