6

C++ のrequiresキーワードに沿って実行したところ、これまでの理解が正しいかどうかを知りたいと思います。require と enable_if の両方テンプレートのコンパイル時間の制約を提供します。必要な場合は、制約がまったく含まれます。

requiresが関数パラメーターを制約する方法を提供する場合、enable_if、コンパイル時の変換をテンプレート型自体の特定の条件に制限することを主な目的としています。

例:

#include <type_traits>

template<typename T>
concept T AdditiveGroup
{
  return requires(const T pA, const T pB)
  {
    { pA + pB }->T;
  };
};

template<typename T>
typename std::enable_if<std::is_integral<T>::value, bool>::type
addElements(const T pA, const T pB)
{ 
  return (pA + pB);
}

この概念は、pA と pB を追加できる場合にのみ機能するはずですが、enable_if 条件は評価を整数型に制限します。

これが正しいかどうか教えてくれてありがとう!

PS: require制約の構文については、まだよくわかりません。さらに、現時点ではどのコンパイラがそれらを受け入れるかわからないので、ヒントをありがとう!

4

1 に答える 1

8

はい、あなたの理解は正しいようです。SFINAE を使用してテンプレートを制約すること (例: enable_if) には、概念に制約されたテンプレートと同じ本質的な効果があります。ただし、(あなたがほのめかしたように) SFINAE には追加の副作用があります。

C++17 に概念を含める理由についての Ville の Jacksonville の論文は、概念と比較した場合の SFINAE ベースの制約の落とし穴を説明する優れた仕事をしています。基本的に:

  • 概念により、演繹をオフにしたり、制約付き関数テンプレートのメタアリティを乱したりせずに、関数引数を制約できます。
  • 概念を使用すると、相互に排他的な制約を持つオーバーロードを簡単に記述できます。
  • 概念によって、さまざまな制約設計が可能になり、特定のインターフェイスに必要な抽象化の種類を決定するためのさまざまなツールがインターフェイス デザイナーに提供されます。
于 2016-05-19T08:55:43.417 に答える