Когда использовать `static _assert `вместо SFINAE?

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

24
задан Xeo 5 October 2012 в 20:31
поделиться