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
に現れることを除いて、可能な限りどこでも比較的単純な方法で使用できます (または、クラスの前方宣言に aを挿入することは可能ですか?) . これにより、より逐語的になり、コードがより明確になります。ただし、SFINAE は複雑なため、単純な.static_assert
static_assert
3.一方static_assert
、より明確なコンパイラ エラー メッセージの利点があり、これが両方の主な目的と見なされているようです。