Я извлек важные фрагменты кода и оставил некоторые реализации, которые не должны иметь значения.
Пункт 1 ниже описывает, как Я хочу, чтобы функция вела себя где is_in_v — это метафункция, которая проверяет, содержится ли значение данного типа в наборе значений после него.
Это прекрасно работает само по себе, но выдает ошибку, когда я пытаюсь передать func(b)... потому что b не является постоянным выражением.
Для меня это имеет смысл, однако элемент 2, кажется, ведет себя нормально во время компиляции, даже если ему передается то же самое значение b.
Это заставляет меня задуматься, соответствует ли моя идея достижимо, потому что мне кажется, что то, что работает в пункте 2, по сути, не так уж далеко от того, что я пытаюсь сделать, но я не знаю, как обойти эту ошибку.
Код: Выделить всё
constexpr bool f1 (int a) { return true; }
constexpr bool f2 (int a) { return false; }
constexpr bool f3 (int a) { return a > 3; }
//Item 1
template
constexpr bool test(int b) {
return !is_in_v;
}
//Item 2
template
constexpr bool test2(int b) {
return func(b);
}
...
int main () {
static_assert(test(5)); //ERROR: b is not a constant expression
static_assert(test2(5)); //works fine
}
Я попробовал передать ссылку на константу, и это сработало для функций f1 и f2, но только делегировало проблему того, что параметр b в тесте не является constexpr, параметру a в f3.
Подробнее здесь: https://stackoverflow.com/questions/790 ... -time-in-c