Я использовал (и видел подержанный)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
имеет преимущество более ясного сообщения об ошибке компилятора, которое некоторые, кажется, считают основной целью любого из них.