26

次の (推奨! ) 構文に欠点はありますか?

template< typename T >
void f() static_assert(std::is_same< T, int >::value)
{ ; }

SFINAE の代わりに (松葉杖のように見えます):

template< typename T, typename = typename std::enable_if< std::is_same< T, int >::value >::type >
void f() { ; }

さらに悪いことに:

template< typename T >
typename std::enable_if< std::is_same< T, int >::value >::type 
f() 
{ ; }

auto結果型の推論の使用を禁止します。

4

2 に答える 2

25

まず第一に、それらは異なります。具体的には、同時にチェックされません。

重要な違いは、過負荷の解決に関するアプリケーションによるものです。SFINAE はオーバーロード セットから関数を選別するため、別の関数が (存在する場合) 選択され、オーバーロードの解決後にstatic_assert適用されるため、コンパイルを停止するエラーが発生します。

さて、あなたの苦情に関してはauto、SFINAEを完全に使用できます。

// Ensure that T is int
template <typename T>
auto f() -> typename std::enable_if< std::is_same< T, int >::value >::type
{ ... }

// Only pick this overload if begin(c) and end(c) are available
template <typename T>
auto f(T const& c) -> decltype(begin(c), end(c), bool{}) { ... }

...そして、SFINAEと自動型推論を完全に使用できます

template <typename T,
          typename = typename std::enable_if<std::is_same<T, int>::value>::type>
auto f() { ... }

template <typename T>
auto f(void* =
       typename std::enable_if<std::is_same<T, int>::value>::type*(0))
{ ... }
于 2013-06-07T06:38:53.340 に答える
6

Concepts Lite構文static_assertよりも使用する方が優れているのはなぜですか?

template< typename T >
  void f() requires Int<T>()
  { }

また:

template< Int T >
  void f()
  { }
于 2013-06-07T08:42:44.320 に答える