私は概念をメタインタフェースの一種と考えています。彼らは能力の後でタイプを分類します。次のC++バージョンはネイティブな概念を提供します。私はC++ 1xのコンセプトを見いだすまで、それはどういう意味で別々ではないタイプを一緒に置くことができるのか理解できませんでした。 Range
インターフェイスがあるとします。あなたは2つの方法でそれをモデル化することができます。一つはサブタイプ関係です:もちろん
class Range {
virtual Iterator * begin() = 0;
virtual Iterator * end() = 0;
virtual size_t size() = 0;
};
、それから派生するすべてのクラスは、レンジインターフェースを実装し、あなたの機能を使用することができます。しかし今、あなたはそれが限られているのを見ます。アレイはどうですか?それも範囲です!
T t[N];
begin() => t
end() => t + size()
size() => N
悲しいことに、そのインターフェイスを実装するRangeクラスから配列を派生させることはできません。余分な方法が必要です(オーバーロード)。第三者のコンテナはどうですか?ライブラリのユーザーは、コンテナを関数とともに使用することができます。しかし、彼はコンテナの定義を変更することはできません。ここでは、概念がゲームに入って来る:
auto concept Range<typename T> {
typename iterator;
iterator T::begin();
iterator T::end();
size_t T::size();
}
今、あなたはT
は、適切なメンバ関数を持っている場合は満たすことができるいくつかのタイプのサポートされている操作について何かを言います。ライブラリでは、汎用関数を記述します。これは、あなたが、それが必要な操作をサポートしていとして、あらゆるタイプを受け入れることができます:
template<Range R>
void assign(R const& r) {
... iterate from r.begin() to r.end().
}
それは代替の偉大なものです。 タイプは、コンセプトに準拠した請求書に適合し、いくつかのインターフェースを積極的に実装するタイプだけでなく、次のC++標準はさらに進んでいます:普通の配列(というコンセプトマップ)によって適合するContainer
コンセプトを定義します。既存の標準コンテナです。
私がこれを引き起こす理由は、コンテナ自体に階層関係があるテンプレート化されたコンテナがあるからです。私はこれらのコンテナを使用するアルゴリズムを記述したいと思います。また、一部のアルゴリズムでは、テンプレートタイプが特定のコンセプトを満たしていることを知ることで利益を得ることができます(たとえばComparable)。
実際には両方のテンプレートを使用できます。階層関係を維持してコードを共有し、アルゴリズムを一般的な方法で書くことができます。たとえば、コンテナが同等であることを伝えるためです。これは、標準的なランダムアクセスのようなものだ/前進/出力/入力イテレータカテゴリが実装されています:
// tag types for the comparator cagetory
struct not_comparable { };
struct basic_comparable : not_comparable { };
template<typename T>
class MyVector : public BasicContainer<T> {
typedef basic_comparable comparator_kind;
};
/* Container concept */
T::comparator_kind: comparator category
それは実際に、それを行うために合理的な簡単な方法です。これで、関数を呼び出すことができ、正しい実装に転送されます。
template<typename Container>
void takesAdvantage(Container const& c) {
takesAdvantageOfCompare(c, typename Container::comparator_kind());
}
// implementation for basic_comparable containers
template<typename Container>
void takesAdvantage(Container const& c, basic_comparable) {
...
}
// implementation for not_comparable containers
template<typename Container>
void takesAdvantage(Container const& c, not_comparable) {
...
}
実際には、これを実装するために使用できる手法があります。別の方法は、boost::enable_if
を使用して、毎回異なる実装を有効または無効にすることです。コンパイル時との差の簡単な例として
C++ 1x?これは、彼らがこの10年間で新しい標準を発表することをあきらめたことを意味するのでしょうか、あるいは将来のC++開発について話していますか? – jpalecek
http://www.research.att.com/~bs/C++0xFAQ.html#concepts – jmucchiello
jpalecek、彼らは2010年にそれをリリースしたいと思います。私はそれをC++ 1xと呼ぶ習慣があります:) –