если constexpr (условие) как условное время компиляции

Я хочу использовать constexpr bool (useF в приведенном ниже примере), чтобы включить функцию в следующем коде. Здесь зовет A::f(), Дополнительно хочу быть алиас-шаблоном (a) быть void в случае, если я отключаю эту функцию.

Я попытался использовать оператор constexpr if, но тело все еще создается, что приводит к ошибке компиляции. Если я использую шаблон оболочки (X), тело выбрасывают, как я и ожидал, но мне это кажется уродливым. Есть ли другие способы сделать это?

constexpr bool useF = false;

struct A {
static void f() {}
};

using a = std::conditional<useF, A, void>::type;

template<typename L>
struct X {
static void h() {
if constexpr(std::is_same<L, A>::value) {
L::f(); // not instantiated, no error
}
}
};

int main() {
if constexpr(useF) {
a::f(); // error!?
}

X<a>::h();
}

Я использую g ++ — 7.0.1 с -std = c ++ 17

3

Решение

if constexpr только для шаблонов. Из [stmt.if]:

Если if заявление имеет форму if constexprзначение условия должно быть контекстно-преобразованным константным выражением типа bool (5.20); эта форма называется constexpr если заявление. Если значение
преобразованное условие falseпервая подстанция представляет собой отклоненное заявление, в противном случае второе подзаголовок, если он присутствует, является отброшенным утверждением. Во время создания замкнутой шаблонной сущности
(Пункт 14)
, если условие не зависит от значения после его создания, исключенное подсостояние (если оно есть) не создается.

В Xоператор constexpr if предотвратит создание экземпляра неправильно сформированного оператора. Это цель этой языковой функции. Но вне шаблонов такого эквивалентного усиления нет.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]