SlideShare a Scribd company logo
C++0x コンセプト

                         高橋晶(アキラ)

ブログ:「Faith and Brave – C++で遊ぼう」
 http://d.hatena.ne.jp/faith_and_brave/


        わんくま同盟 東京勉強会 #33
Agenda
一部:基礎
• 概要
• 動機
• コンセプトの定義
• テンプレートパラメータの制約
• コンセプトマップ

二部:発展
• 関連型と関連要件
• 暗黙のコンセプト定義と、明示的なコンセプト定義
• 要件指定のシンタックスシュガー
• Axiom
• コンセプトの階層化
• コンセプトに基づいたオーバーロード
• 範囲for文
• 次期標準ライブラリのコンセプト

             わんくま同盟 東京勉強会 #33
一部:基礎

背景
主要な機能




        わんくま同盟 東京勉強会 #33
概要

• コンセプトは、テンプレートをさらに強力に、さ
  らに使いやすくするための型システム

• テンプレートパラメータに対する制約

・テンプレートライブラリを作るのがラクになる
 (というよりは、より明示的になる、かな)



         わんくま同盟 東京勉強会 #33
動機1 - エラーメッセージの問題

テンプレートインスタンス化時の
エラーメッセージを改善する

list<int> ls;
sort(ls.begin(), ls.end()); // エラー!



↓VC9が出力するエラーメッセージ




                  わんくま同盟 東京勉強会 #33
main.cpp
error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して
          'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
    with
    [
       _Ty=int,
       _Secure_validation=true
    ]
    C:¥Program Files¥Microsoft Visual Studio 9.0¥VC¥include¥xutility(2238) : 'std::operator -' の宣言を確認してください。
    .¥main.cpp(9) : コンパイルされたクラスの テンプレート のインスタンス化 'void std::sort<std::list<_Ty>::_Iterator<_Secure_validation>>(_RanIt,_RanIt)' の参照を確認してください
    with
    [
       _Ty=int,
       _Secure_validation=true,
       _RanIt=std::list<int>::_Iterator<true>
    ]
error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して
          'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
    with
    [
       _Ty=int,
       _Secure_validation=true
    ]

    'std::operator -' の宣言を確認してください。
error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して
           'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
    with
    [
       _Ty=int,
       _Secure_validation=true
    ]

    'std::operator -' の宣言を確認してください。
error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して
           'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
    with
    [
       _Ty=int,
       _Secure_validation=true
    ]

    'std::operator -' の宣言を確認してください。
error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して
           'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
    with
    [
       _Ty=int,
       _Secure_validation=true
    ]
    'std::operator -' の宣言を確認してください。
error C2784: 'reverse_iterator<_RanIt>::difference_type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : テンプレート 引数を 'const std::reverse_iterator<_RanIt> &' に対して
           'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
    with
    [
       _Ty=int,
       _Secure_validation=true
    ]
    'std::operator -' の宣言を確認してください。
を確認してください。                                                                                わんくま同盟 東京勉強会 #33
error C2784: '_Base1::difference_type std::operator -(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : テンプレート 引数を 'const std::_Revranit<_RanIt,_Base>   &' に対して
           'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
      with
      [
         _Ty=int,
         _Secure_validation=true
      ]
      'std::operator -' の宣言を確認してください。
error C2784: '_Base1::difference_type std::operator -(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : テンプレート 引数を 'const std::_Revranit<_RanIt,_Base>   &' に対して
           'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
      with
      [
         _Ty=int,
         _Secure_validation=true
      ]
      'std::operator -' の宣言を確認してください。
error C2784: '_Base1::difference_type std::operator -(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : テンプレート 引数を 'const std::_Revranit<_RanIt,_Base>   &' に対して
           'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
      with
      [
         _Ty=int,
         _Secure_validation=true
      ]
      'std::operator -' の宣言を確認してください。
error C2784: '_Base1::difference_type std::operator -(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : テンプレート 引数を 'const std::_Revranit<_RanIt,_Base>   &' に対して
           'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
      with
      [
         _Ty=int,
         _Secure_validation=true
      ]
      'std::operator -' の宣言を確認してください。
error C2784: '_Base1::difference_type std::operator -(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : テンプレート 引数を 'const std::_Revranit<_RanIt,_Base>   &' に対して
           'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
      with
      [
         _Ty=int,
         _Secure_validation=true
      ]
      'std::operator -' の宣言を確認してください。
error C2784: '_Base1::difference_type std::operator -(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : テンプレート 引数を 'const std::_Revranit<_RanIt,_Base>   &' に対して
           'std::list<_Ty>::_Iterator<_Secure_validation>' から減少できませんでした
      with
      [
         _Ty=int,
         _Secure_validation=true
      ]
      'std::operator -' の宣言を確認してください。
error C2676: 二項演算子 '-' : 'std::list<_Ty>::_Iterator<_Secure_validation>' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。(新しい動作; ヘルプを参照)
      with
      [
         _Ty=int,
         _Secure_validation=true
      ]


                                                                    わんくま同盟 東京勉強会 #33
error C2780: 'void std::_Sort(_RanIt,_RanIt,_Diff,_Pr)' : 4 引数が必要です - 3 が設定されます。
'std::_Sort' の宣言を確認してください。
動機1 - エラーメッセージの問題



  本当は以下のようなエラーメッセージを
  出力してほしい
エラー!list<int>::iteratorはoperator<を持ってないので
ランダムアクセスイテレータの要件を満たしません。




                      わんくま同盟 東京勉強会 #33
動機2 – テンプレートをより強力に

• C++03までは、知る人ぞ知る
  テンプレートの手法が数多くあった
  (SFINAE, Traits, タグディスパッチ, etc...)

• コンセプトは、これらの手法を言語で総括的
  にサポートするという目的がある




              わんくま同盟 東京勉強会 #33
コンセプトの定義

テンプレートパラメータの型に対する
制約を定義する

auto concept LessThanComparable<class T> {
    bool operator<(const T&, const T&);
}

LessThanComparableは
「Tはoperator<によって比較できなければならない」
という制約

                わんくま同盟 東京勉強会 #33
テンプレートパラメータの制約

テンプレート定義の際にコンセプトを指定すること
 によって、テンプレートパラメータを制約すること
 ができる

template <LessThanComparable T>
const T& min(const T& a, const T& b)
{
    return a < b ? a : b;
}

typename T/class Tの代わりに
LessThanComparable Tと書く


                 わんくま同盟 東京勉強会 #33
テンプレートパラメータの制約

• requiresで制約することもできる

template <class T>
  requires LessThanComparable<T>
const T& min(const T& a, const T& b)
{
    return a < b ? a : b;
}




                   わんくま同盟 東京勉強会 #33
テンプレートパラメータの制約

• requiresは&&で複数のコンセプトを指定できる

template <class T>
  requires LessThanComparable<T> &&
           CopyConstructible<T>
const T& min(const T& a, const T& b)
{
    return a < b ? a : b;
}




                   わんくま同盟 東京勉強会 #33
テンプレートパラメータの制約
このような制約を定義/指定することで
テンプレートパラメータが何を満たさなければならないかが
明示的になるのでよりわかりやすいエラーメッセージを出力できるようになる。


list<int> ls;
sort(ls.begin(), ls.end()); // エラー!



エラー!list<int>::iteratorはRandomAccessIteratorの要件を満たしません。
不足しているもの:operator<




                      わんくま同盟 東京勉強会 #33
コンセプトマップ

既存の型がどのようにコンセプトの要件を
満たすのかを定義する

以下のようなコンセプトがあった場合


auto concept RandomAccessIterator<class X> {
    typename value_type = X::value_type;
}

RandomAccessIteratorコンセプトは
「Xはvalue_typeという型を持っていなければならない」という要件になるので

                   わんくま同盟 東京勉強会 #33
コンセプトマップ
vector::iteratorのようなvalue_typeを持つ型は
RandomAccessIteratorの要件を満たす

template <RandomAccessIterator Iter>
void sort(Iter first, Iter last);

std::vector<int> v;
sort(v.begin(), v.end()); // OK

ポインタもランダムアクセスイテレータとして振る舞えなくてはならないが、
ポインタはvalue_typeという型を持っていないので
RandomAccessIteratorの要件を満たすことはできない。

int ar[3];
sort(ar, ar + 3); // エラー!



                    わんくま同盟 東京勉強会 #33
コンセプトマップ
そこで、コンセプトマップという機能を使用することで
RandomAccessIteratorコンセプトをポインタで特殊化する。

template <class T>
concept_map RandomAccessIterator<T*> { // ポインタだったら
    typename value_type = T; // T型をvalue_typeとする
}


これを用意しておけば、ポインタはRandomAccessIteratorの
要件を満たすことができる。

int ar[3];
sort(ar, ar + 3); // OK


                   わんくま同盟 東京勉強会 #33
二部:発展

詳細な機能たくさん
Range-base for文
標準ライブラリのコンセプト




            わんくま同盟 東京勉強会 #33
関連型

以下のようなコンセプトを書いた場合、
result_typeの型はテンプレートと同様の
あらゆる型を受け取れる型になる。
(プレースホルダだと考えていいかと)


auto concept Function<class F> {
    typename result_type; // 関連型。=で制約していない
    result_type operator()(F&);
}

これを関連型(Associated Type)という。



                 わんくま同盟 東京勉強会 #33
関連型
以下のような関数オブジェクトがあった場合に

struct functor {
    int operator()() const;
};

functorをFunctionコンセプトに通すと

template <Function F>
F::result_type foo(F f)
{
    return foo();
}

int result = foo(functor());

F::result_typeの型は、functor::operator()の戻り値の型(int)になる。




                            わんくま同盟 東京勉強会 #33
関連型
ちなみに、コンセプト内で

typename result_type;

と書いてあるので、result_typeが型であることが明示的になるので

typename F::result_type

のように、依存名(dependent-name)に対するtypenameを書く必要
 がなく、

F::result_type

と書ける。


                 わんくま同盟 東京勉強会 #33
関連要件

requiresはコンセプト内でも書ける
これを関連要件(Associated Requirements)という。


auto concept Predicate<class F, class R, class... Args> {
    requires Convertible<R, bool>;
}

述語(Predicate)の戻り値の型はboolに変換可能な型でなければならない。




                     わんくま同盟 東京勉強会 #33
関連要件

関連要件は、関連型に対しても指定できる

auto concept Function<class F> {
    typename result_type;
    requires Returnable<result_type>;

    result_type operator()(F&);
}


関数(Function)の戻り値の型は、
return文で返せないといけない。(配列はNG、void
  はOK)

                 わんくま同盟 東京勉強会 #33
暗黙のコンセプト定義と
                    明示的なコンセプト定義

コンセプトの定義は2つの書き方がある。
先頭にautoを付けるものと付けないもの。
auto concept Fooable<class X>
{ typename value_type = X::value_type;   }

concept Fooable<class X>
{ typename value_type; }

autoを付けないコンセプトは、必ずコンセプトマップしなければならないコンセプト。
明示的なコンセプト(explicit concept)という。

autoを付けるコンセプトは、デフォルトのコンセプトマップが自動生成されるコンセプト。
暗黙のコンセプト(implicit concept)という。



                       わんくま同盟 東京勉強会 #33
要件指定のシンタックスシュガー

まず、以下のようなコンセプトがあった場合

auto concept Fooable<class X> {}


要件指定するときに以下のように書くと

template <Fooable T>
void foo(T t);


FooableコンセプトのパラメータXとしてTが渡される。


                 わんくま同盟 東京勉強会 #33
要件指定のシンタックスシュガー

複数パラメータを受け取るコンセプトは
どう書けばいいのだろうか?

auto concept Fooable<class X, class Y> {}

// NG : Tを宣言する前に使ってはいけない
template <Fooable<T, int> T>
void foo(T t);

// OK : でもrequiresを書くのはめんどくさい
template <class T>
  requires Fooable<T, int>
void foo(T t);


                     わんくま同盟 東京勉強会 #33
要件指定のシンタックスシュガー
複数パラメータを受け取るコンセプトの
要件指定には、autoを指定するシンタックスシュガーが用意されている

auto concept Fooable<class X, class Y> {}

template <Fooable<auto, int> T>
void foo(T t);

この場合、autoはTに置き換えられ、以下と同じ意味になる。

template <class T>
  requires Fooable<T, int>
void foo(T t);


                   わんくま同盟 東京勉強会 #33
要件指定のシンタックスシュガー

autoによるシンタックスシュガーの使用例:

標準で提供される予定のCallableコンセプトはその名の通り
「関数呼び出し可能」という制約を持つコンセプトである。

auto concept Callable<typename F, typename... Args> {
    typename result_type;
    result_type operator()(F&&, Args...);
}

Callableコンセプトは、以下のパラメータを受け取る
関数ポインタ/関数オブジェクト : F
引数の型 : ...Args


                     わんくま同盟 東京勉強会 #33
要件指定のシンタックスシュガー
Callableコンセプトは使用頻度が高くなる(と思う)ので、
毎回以下のように書くのはめんどくさい。
template <class F>
  requires Callable<F, int>
F::result_type call(F f)
{
    return f();
}

autoによるシンタックスシュガーを使用すればすっきり書ける。
template <Callable<auto, int> F>
F::result_type call(F f)
{
    return f();
}


                  わんくま同盟 東京勉強会 #33
Axiom
コンセプトの定義では、axiomという機能を使用することにより、
型のセマンティクスを定義することもできる。

たとえば、以下のコンセプトは「operator==で比較可能」という制約を
持っているが、それと同時に
「operator==は、a == b、b == cが成り立つならa == cが成り立つ」という
公理を定義している。
auto concept EqualComparable<class T> {
  bool operator==(const T&, const T&);

    axiom Transitivity(T a, T b, T c)
    {
      if (a == b && b == c)
        a == c;
    }
}

ただし、axiomはコンパイル時に検証することは困難であるため
「コンパイラでこの情報を最適化や単体テストに使ってもいいよ」という処理系依存の動作となる。



                              わんくま同盟 東京勉強会 #33
コンセプトの階層化

イテレータは以下のような階層構造を持っている。

          Input Iterator
                ↑
        Forward Iterator
                ↑
      Bidirectional Iterator
                ↑
     Random Access Iterator

          わんくま同盟 東京勉強会 #33
コンセプトの階層化



  コンセプトはこのような階層構造を直接表現できる。
concept   InputIterator<class X> {}
concept   ForwardIterator<class X>       : InputIterator<X> {}
concept   BidirectionalIterator<class X> : ForwardIterator<X> {}
concept   RandomAccessIterator<class X> : BidirectionalIterator<X>{}

これは「コンセプトの継承」と見なすことができる。
コンセプトの階層化(Concept Refinement)は
関連要件(Associated Requirements)と違い、
コンセプトマップにも影響を与える。

コンセプトの階層化と関連要件は、継承と包含の関係と同様に
“is_a”関係、”has-a”関係を表す。



                          わんくま同盟 東京勉強会 #33
コンセプトに基づいたオーバーロード

C++03ではイテレータの分類によるオーバーロードを
実現するためにタグディスパッチを使用していた。

1.分類用のタグを用意する

struct   input_iterator_tag {};
struct   output_iterator_tag {};
struct   forward_iterator_tag       : input_iterator_tag{};
struct   bidirectional_iterator_tag : forward_iterator_tag{};
struct   random_access_iterator_tag : bidirectional_iterator_tag{};




                          わんくま同盟 東京勉強会 #33
コンセプトに基づいたオーバーロード

2.イテレータのクラスにタグを埋め込む

class vector::iterator(仮) {
  typedef random_access_iterator_tag iterator_category;
};

class list::iterator(仮) {
  typedef bidirectional_iterator_tag iterator_category;
};




                     わんくま同盟 東京勉強会 #33
コンセプトに基づいたオーバーロード

3. タグを返すメタ関数を用意する

template <class Iterator>
struct iterator_traits {
  ...
  typedef typename Iterator::iterator_category iterator_category;
};

template <class T>
struct iterator_traits<T*> {
  ...
  typedef random_access_iterator_tag iterator_category;
};
// ポインタはランダムアクセスイテレータとして扱う



                        わんくま同盟 東京勉強会 #33
コンセプトに基づいたオーバーロード

4. タグでオーバーロードする
template <class InputIter, class Distance>
void _advance(InputIter first, InputIter last, Distance n, input_iterator_tag);

template <class ForwardIter, class Distance>
void _advance(ForwardIter first, ForwardIter last, Distance n, forward_iterator_tag);

template <class BidIter, class Distance>
void _advance(BidIter first, BidIter last, Distance n, bidirectional_iterator_tag);

template <class RAIter, class Distance>
void _advance(RAIter first, RAIter last, Distance n, random_access_iterator_tag);

template <class Iterator class Distance>
void advance(Iterator first, Iterator last, Distance n)
{
  _advance(first, last, typename iterator_traits<Iterator>::iterator_category());
}




                                わんくま同盟 東京勉強会 #33
コンセプトに基づいたオーバーロード

タグディスパッチによるオーバーロードはとてもめんどくさかった。
コンセプトを使えばこれだけで済む。

template <InputIterator Iter, class Distance>
void advance(Iter first, Iter last, Distance n);

template <ForwardIterator Iter, class Distance>
void advance(Iter first, Iter last, Distance n);

template <BidirectionalIterator Iter, class Distance>
void advance(Iter first, Iter last, Distance n);

template <RandomAccessIterator Iter, class Distance>
void advance(Iter first, Iter last, Distance n);


                     わんくま同盟 東京勉強会 #33
コンセプトに基づいたオーバーロード

型特性によるオーバーロードは
C++03ではSFINAE(Substitution Failure Is Not An Error)を
使用していた

// 整数型
template <class T>
void foo(T t, typename enable_if<is_integral<T> >::type* = 0);

// 整数型以外
template <class T>
void foo(T t, typename disable_if<is_integral<T> >::type* = 0);




                        わんくま同盟 東京勉強会 #33
コンセプトに基づいたオーバーロード

コンセプトを使えばこれだけで済む

template <class T>
  requires IntegralType<T> // 整数型
void foo(T t);

template <class T>
  requires !IntegralType<T> // 整数型以外
void foo(T t);




                  わんくま同盟 東京勉強会 #33
範囲for文

C++0xではコンテナ/配列をループするための
新たなfor文が提供される。

vector<int> v = {1, 2, 3};
for (int i : v) {
  cout << i << endl;
}

int ar[] = {1, 2, 3};
for (int i : ar) {
  cout << i << endl;
}


                   わんくま同盟 東京勉強会 #33
範囲for文

範囲for文は、std::Rangeコンセプトを満たす
型のみ適用可能

concept Range<class T> {
    InputIterator iterator;
    iterator begin(T&);
    iterator end(T&);
}




                   わんくま同盟 東京勉強会 #33
範囲for文

標準では配列、コンテナ、initializer_list等での
コンセプトマップが提供される。
// 配列
template <class T, size_t N>
concept_map Range< T[N] > {
  typedef T* iterator;
  iterator begin(T(&a)[N]) { return a; }
  iterator end(T(&a)[N])    { return a + N; }
};




                    わんくま同盟 東京勉強会 #33
範囲for文


// コンテナ(vector, list, map, etc...)
template <Container C>
concept_map Range<C>
{
  typedef C::iterator iterator;
  iterator begin(C& c){ return Container<C>::begin(c);}
  iterator end(C& c) { return Container<C>::end(c);}
}


ユーザー定義のコンテナも、std::Rangeを
コンセプトマップすれば範囲for文に適用可能。

                     わんくま同盟 東京勉強会 #33
標準ライブラリで提供される予定のコンセプト
// 型変換
auto concept IdentityOf<typename T>;
auto concept RvalueOf<typename T>;

// true
concept True<bool> {}
concept_map True<true> {}

// 型特性
concept LvalueReference<typename T> { }
template <typename T> concept_map LvalueReference<T&> { }

concept RvalueReference<typename T> { }
template <typename T> concept_map RvalueReference<T&&> { }



                     わんくま同盟 東京勉強会 #33
標準ライブラリで提供される予定のコンセプト
// 演算子
auto concept   HasPlus<typename T, typename U>;
auto concept   HasMinus<typename T, typename U>;
auto concept   HasMultiply<typename T, typename U>;
auto concept   HasDivide<typename T, typename U>;
...

// 述語
auto concept Predicate<typename F, typename... Args>;

// 比較
auto concept   LessThanComparable<typename T>;
auto concept   EqualityComparable<typename T>;
auto concept   StrictWeakOrder<typename F, typename T>;
auto concept   EquivalenceRelation<typename F, typename T>;


                       わんくま同盟 東京勉強会 #33
標準ライブラリで提供される予定のコンセプト
// コンストラクタとデストラクタ
auto concept HasConstructor<typename T, typename... Args>;
auto concept Constructible<typename T, typename... Args>;
auto concept HasDestructor<typename T>;
auto concept HasVirtualDestructor<typename T>;

// コピーとムーブ
auto concept MoveConstructible<typename T>;
auto concept CopyConstructible<typename T>;
auto concept MoveAssignable<typename T>;
auto concept CopyAssignable<typename T>;




                     わんくま同盟 東京勉強会 #33
標準ライブラリで提供される予定のコンセプト
// C++言語がサポートする型特性
concept Returnable<typename T>;
concept PointeeType<typename T>;
concept ClassType<typename T>;
concept PolymorphicClass<typename T>;
concept IntegralType<typename T>;
concept FloatingPointType<typename T>;
concept SameType<typename T, typename U>;
concept DerivedFrom<typename Derived, typename Base>;
...




                     わんくま同盟 東京勉強会 #33
紹介しきれなかったものを簡単に紹介
• late_check
 テンプレートのインスタンス化時までコンセプトのチェックを遅らせる

• 名前付き要件
 requiresに名前を付ける

• スコープ付きコンセプトマップ
 別な名前空間でコンセプトマップを定義する

・ルックアップ
 コンセプトにもADLあるよ。

・否定要件
 requiresを指定するときに頭に「!」を付けると「コンセプトの要件を満たさな
   かった場合」という要件にできる

                   わんくま同盟 東京勉強会 #33
参考
• N1758 Concepts for C++0x
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1758.pdf

• N2773 Proposed Wording for Concepts(Revision 9)
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2773.pdf

• An Introduction to Concepts in C++0x
http://tinyurl.com/c38f7o

• Concepts: Extending C++ Templates for Generic Programming
http://www.generic-
   programming.org/languages/conceptcpp/papers/accu07.ppt



                         わんくま同盟 東京勉強会 #33
まとめ

• テンプレートパラメータの要件が明確になる

• コンセプトマップによってサードパーティ製の
  ライブラリでも標準コンセプトの要件を満たす
  ことができる

• コンセプトによるオーバーロードは超強力!



        わんくま同盟 東京勉強会 #33

More Related Content

PDF
C++ Template Metaprogramming
PDF
Effective Modern C++ 勉強会#1 Item3,4
PDF
C++0x 言語の未来を語る
PDF
templateとautoの型推論
PPTX
Emcpp0506
PDF
Template Meta Programming入門から応用まで
PPTX
Effective modern C++ 勉強会 #3 Item 12
PDF
Ruby test double
C++ Template Metaprogramming
Effective Modern C++ 勉強会#1 Item3,4
C++0x 言語の未来を語る
templateとautoの型推論
Emcpp0506
Template Meta Programming入門から応用まで
Effective modern C++ 勉強会 #3 Item 12
Ruby test double

What's hot (20)

PPTX
最新C++事情 C++14-C++20 (2018年10月)
PDF
魂のコーディング
PDF
知って得するC#
PDF
C++ Template Meta Programming の紹介@社内勉強会
PDF
C#coding guideline その2_20130325
PDF
unique_ptrにポインタ以外のものを持たせるとき
PDF
Emcpp item31
PDF
C++0x in programming competition
PDF
君はまだ,本当のプリプロセスを知らない
PDF
わんくま同盟大阪勉強会#61
PDF
ゲーム開発者のための C++11/C++14
PPTX
C#6.0の新機能紹介
PDF
Replace Output Iterator and Extend Range JP
PDF
オブジェクト指向できていますか?
PPTX
函数プログラミングの エッセンスと考え方
PDF
C++11概要 ライブラリ編
PPTX
競技プログラミングのためのC++入門
PDF
Effective Modern C++ Item 7&8
PPT
プログラミングで言いたいこと聞きたいこと集
ODP
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
最新C++事情 C++14-C++20 (2018年10月)
魂のコーディング
知って得するC#
C++ Template Meta Programming の紹介@社内勉強会
C#coding guideline その2_20130325
unique_ptrにポインタ以外のものを持たせるとき
Emcpp item31
C++0x in programming competition
君はまだ,本当のプリプロセスを知らない
わんくま同盟大阪勉強会#61
ゲーム開発者のための C++11/C++14
C#6.0の新機能紹介
Replace Output Iterator and Extend Range JP
オブジェクト指向できていますか?
函数プログラミングの エッセンスと考え方
C++11概要 ライブラリ編
競技プログラミングのためのC++入門
Effective Modern C++ Item 7&8
プログラミングで言いたいこと聞きたいこと集
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
Ad

Viewers also liked (16)

PDF
Boost tour 1_61_0 merge
PDF
C++1z draft
PDF
Boost Fusion Library
PDF
C++14 variable templates
PDF
C++コンパイラ GCCとClangからのメッセージをお読みください
PDF
テンプレートメタプログラミング as 式
PPTX
ナウなヤングにバカうけのイカしたタグ付き共用体
PDF
C++ tips2 インクリメント編
PDF
Learning Template Library Design using Boost.Geomtry
PDF
C++ マルチスレッド 入門
PDF
プログラムを高速化する話
PDF
よいコード、わるいコード
PPTX
C++ tips1 #include編
PPTX
C++ tips4 cv修飾編
PPTX
C++ tips 3 カンマ演算子編
PDF
インフラエンジニアがUnityをやるべきたった一つの理由
Boost tour 1_61_0 merge
C++1z draft
Boost Fusion Library
C++14 variable templates
C++コンパイラ GCCとClangからのメッセージをお読みください
テンプレートメタプログラミング as 式
ナウなヤングにバカうけのイカしたタグ付き共用体
C++ tips2 インクリメント編
Learning Template Library Design using Boost.Geomtry
C++ マルチスレッド 入門
プログラムを高速化する話
よいコード、わるいコード
C++ tips1 #include編
C++ tips4 cv修飾編
C++ tips 3 カンマ演算子編
インフラエンジニアがUnityをやるべきたった一つの理由
Ad

Similar to C++0x concept (20)

PDF
What is template
PPTX
Lambda in template_final
PPTX
T69 c++cli ネイティブライブラリラッピング入門
PDF
PHP 2大 web フレームワークの徹底比較!
PDF
20120118 titanium
PDF
Boost tour 1_40_0
PDF
Boost Tour 1.50.0 All
PDF
規格書で読むC++11のスレッド
PDF
エキ Py 読書会02 2010/9/7
PDF
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
PDF
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
PDF
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
PPTX
.NET Core 2.x 時代の C#
PDF
How We UITest with GraphQL
PDF
Python standard 2022 Spring
PPTX
プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~
PPTX
エンタープライズ分野での実践AngularJS
PPTX
C++の復習
PPTX
DB TechShowcase Tokyo - Intelligent Data Platform
PPTX
CAP Custom Handlers をクリーンにしよう
What is template
Lambda in template_final
T69 c++cli ネイティブライブラリラッピング入門
PHP 2大 web フレームワークの徹底比較!
20120118 titanium
Boost tour 1_40_0
Boost Tour 1.50.0 All
規格書で読むC++11のスレッド
エキ Py 読書会02 2010/9/7
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
.NET Core 2.x 時代の C#
How We UITest with GraphQL
Python standard 2022 Spring
プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~
エンタープライズ分野での実践AngularJS
C++の復習
DB TechShowcase Tokyo - Intelligent Data Platform
CAP Custom Handlers をクリーンにしよう

More from Akira Takahashi (20)

PPTX
Cpp20 overview language features
PDF
Cppmix 02
PPTX
Cppmix 01
PDF
Modern C++ Learning
PDF
cpprefjp documentation
PDF
Boost tour 1_61_0
PDF
error handling using expected
PDF
Boost tour 1.60.0 merge
PDF
Boost tour 1.60.0
PDF
Boost container feature
PDF
Boost Tour 1_58_0 merge
PDF
Boost Tour 1_58_0
PDF
C++14 solve explicit_default_constructor
PDF
C++14 enum hash
PDF
Multi paradigm design
PDF
Start Concurrent
PDF
Programmer mind
PDF
Boost.Study 14 Opening
PDF
Executors and schedulers
PDF
Improvement future api
Cpp20 overview language features
Cppmix 02
Cppmix 01
Modern C++ Learning
cpprefjp documentation
Boost tour 1_61_0
error handling using expected
Boost tour 1.60.0 merge
Boost tour 1.60.0
Boost container feature
Boost Tour 1_58_0 merge
Boost Tour 1_58_0
C++14 solve explicit_default_constructor
C++14 enum hash
Multi paradigm design
Start Concurrent
Programmer mind
Boost.Study 14 Opening
Executors and schedulers
Improvement future api

C++0x concept