скомпилироваться? Хочу шаблон некой функции проверить.
static_assert
Если тест не скомпилировался — он не пройден
Напишите скрипт, который будет возвращать ошибку, если компилятор вернёт 0.
в общем, у меня есть такая функция: template <typename T> void foo(){ if constexpr (std::is_same_v<T, int>){} else if constexpr (std::is_same_v<T, float>){} else { static_assert(false); } } могу ли я как-то убедиться, что при T=double этот шаблон не соберется?
Он всегда не соберётся
так не интересно :))
почему?
Потому что static_assert(false) всегда не скомпилируется
Если int или float, то собраться должен
так до туда ведь не должно дойти в некоторых случаях
Можно представить, что там велосипедный my_static_assert<false>{} и тогда это будет семантическая ошибка
Погугли что такое dependent_false
Почему бы туда просто не написать static_assert(!std::is_same_v<T, double>);, или нужна свинья?
у меня около 20 типов, а в одном из шаблонов вызывается другой(10 типов), в котором, соответственно, другие типы. Я скорее где-то запутаюсь
Ээ, и что? Нужно же чтобы этот не собирался с double
Какой у тебя стандарт?
template <class T> struct helper { static constexpr int value = 1; }; template <> struct helper<double> { static constexpr int value = -1; }; template <typename T> void foo(T arg){ if constexpr (std::is_same_v<T, int>){ printf("int\r\n"); } else if constexpr (std::is_same_v<T, float>){ printf("float\r\n"); } else { char _[helper<T>::value]; } } И можете тест не писать. Массив с отрицательным размером никогда не соберётся.
Какой-то С++03 подход
вариант со статик асертом тоже не соберется. Но мне нужно это загнать в тесты
Обсуждают сегодня