Я использовал (и видел) static_assert
для обозначения нежелательных значений значений параметров шаблона. Однако для всех случаев, с которыми я столкнулся, кажется лучше и элегантнее отключать эти нежелательные значения через SFINAE. Например
template<typename T,
class = std::enable_if<std::is_floating_point<T>::value>::type>
struct Foo { ... };
вместо
template<typename T>
struct Foo {
static_assert(std::is_floating_point<T>::value,
"Foo<T>: T must be floating point :-(");
...
};
Итак, мой вопрос: когда использовать static_assert
вместо SFINAE и почему?
ИЗМЕНИТЬ
Я думаю, что я узнал до сих пор следующее
1 SFINAE - это универсальный и мощный, но потенциально очень сложный инструмент, который может использоваться для многих задач, включая разрешение функции перегрузки (которое, по-видимому, рассматривается как единственная цель).
2. SFINAE может использоваться относительно простым способом, когда когда-либо static_assert
может, за исключением того, что он появляется в объявлении (класса или функции), а не в его определении (или возможно вставить static_assert
в, скажем, декларацию класса вперед?). Это делает более дословным и, следовательно, более четким кодом. Однако, поскольку SFINAE сложна, имеет тенденцию быть более сложным, чем простой static_assert
.
3 С другой стороны, static_assert
имеет преимущество более четкого сообщения об ошибке компилятора, которое, по-видимому, рассматривается как основная цель.