Я хочу использовать 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
if constexpr
только для шаблонов. Из [stmt.if]:
Если
if
заявление имеет формуif constexpr
значение условия должно быть контекстно-преобразованным константным выражением типаbool
(5.20); эта форма называется constexpr если заявление. Если значение
преобразованное условиеfalse
первая подстанция представляет собой отклоненное заявление, в противном случае второе подзаголовок, если он присутствует, является отброшенным утверждением. Во время создания замкнутой шаблонной сущности
(Пункт 14), если условие не зависит от значения после его создания, исключенное подсостояние (если оно есть) не создается.
В X
оператор constexpr if предотвратит создание экземпляра неправильно сформированного оператора. Это цель этой языковой функции. Но вне шаблонов такого эквивалентного усиления нет.
Других решений пока нет …