コンセプト (C++)
コンセプト(
背景
C++では、テンプレートクラス・Foo&
Foo
のあらゆるサブタイプをFoo
のサブタイプであること)が、テンプレートの
コンセプトをvector
をvector
クラス」にvector
にvector
の
機能 の概要
コンセプトが
コンセプトは、
template<LessThanComparable T>
const T& min(const T &x, const T &y)
{
return x < y ? x : y;
}
テンプレート
より
template<typename T> requires LessThanComparable<T>
const T& min(const T &x, const T &y)
{
return x < y ? x : y;
}
requiresキーワードの
コンセプトは
auto concept LessThanComparable<typename T>
{
bool operator<(T, T);
}
この
このコンセプトは、「 <
を
コンセプトは、
auto concept Convertible<typename T, typename U>
{
operator U(const T&);
}
これをテンプレートで
template<typename U, typename T> requires Convertible<T, U>
U convert(const T& t)
{
return t;
}
コンセプトは
concept InputIterator<typename Iter, typename Value>
{
require Regular<Iter>;
Value operator*(const Iter&);
Iter& operator++(Iter&);
Iter operator++(Iter&, int);
}
InputIteratorコンセプトに
concept ForwardIterator<typename Iter, typename Value> : InputIterator<Iter, Value>
{
//ここに他 の要件 を追記 する。
}
コンセプトに
concept InputIterator<typename Iter>
{
typename value_type;
typename reference;
typename pointer;
typename difference_type;
require Regular<Iter>;
require Convertible<reference, value_type>;
reference operator*(const Iter&); // デリファレンス
Iter& operator++(Iter&); // 前 置 インクリメント
Iter operator++(Iter&, int); // 後 置 インクリメント
// ...
}
コンセプトマップ
コンセプトマップは、コンセプトに
concept_map InputIterator<char*>
{
typedef char value_type;
typedef char& reference;
typedef char* pointer;
typedef std::ptrdiff_t difference_type;
};
このコンセプトマップは、InputIteratorコンセプトを
template<typename T> concept_map InputIterator<T*>
{
typedef T value_type;
typedef T& reference;
typedef T* pointer;
typedef std::ptrdiff_t difference_type;
};
さらに、コンセプトマップは、クラスに
concept Stack<typename X>
{
typename value_type;
void push(X&, const value_type&);
void pop(X&);
value_type top(const X&);
bool empty(const X&);
};
template<typename T> concept_map Stack<std::vector<T> >
{
typedef T value_type;
void push(std::vector<T>& v, const T& x) { v.push_back(x); }
void pop(std::vector<T>& v) { v. pop_back(); }
T top(const std::vector<T>& v) { return v. back(); }
bool empty(const std::vector<T>& v) { return v. empty(); }
};
このコンセプトマップは、Stackコンセプトを
公理
axiom
キーワードを
コンセプトによるチェックからの除外
late_check
キーワードを
暗黙 のコンセプト
いくつかのコンセプトは、ライブラリの
関連 する機能
コンセプトをベースとした
範囲 ベースの for ループ
Boost C++ ライブラリでは、いくつか "
for
int my_array[5] = { 1, 2, 3, 4, 5 };
for (int &x : my_array) {
x *= 2;
}
for
ループでは、for
ループでstd::vector
などの
コンセプトライブラリ
C++0xにはコンセプトのライブラリが
- <concepts>
<type_traits>のコンセプト
- <container_concepts>
- <iterator_concepts>
- <memory_concepts>
削除 の経緯
今後 の予定
参考 文献
- ^ InformIT, The Removal of Concepts From C++0x Jul 23, 2009. http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=441
- ^ Pete Becker, Working Draft, Standard for Programming Language C++, 2009-06-22 コンセプトは14.10
節 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2914.pdf - ^ N2914 14.10.1.4 Axioms
- ^ N2914 6.9 Late-checked block
- ^ N2914 14.10.4 Supported concepts
- ^ N2914 20.2 Concepts
- ^ N2914 23.2.6 Container concepts
- ^ N2914 24.2 Iterator concepts
- ^ N2914 20.8 Memory