Я извлек важные фрагменты кода и оставил некоторые реализации, которые не должны иметь значения.
Пункт 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