SlideShare a Scribd company logo
1 of 50
Download to read offline
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

What's hot

最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)Akihiko Matuura
 
魂のコーディング
魂のコーディング魂のコーディング
魂のコーディングDaisuke Tasaki
 
知って得するC#
知って得するC#知って得するC#
知って得するC#Shota Baba
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
 
C#coding guideline その2_20130325
C#coding guideline その2_20130325C#coding guideline その2_20130325
C#coding guideline その2_20130325Yoshihisa Ozaki
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときShintarou Okada
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らないdigitalghost
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61TATSUYA HAYAMIZU
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
Replace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPReplace Output Iterator and Extend Range JP
Replace Output Iterator and Extend Range JPAkira Takahashi
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
函数プログラミングの エッセンスと考え方
函数プログラミングのエッセンスと考え方函数プログラミングのエッセンスと考え方
函数プログラミングの エッセンスと考え方啓 小笠原
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編egtra
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
Effective Modern C++ Item 7&8
Effective Modern C++ Item 7&8Effective Modern C++ Item 7&8
Effective Modern C++ Item 7&8明 高橋
 
プログラミングで言いたいこと聞きたいこと集
プログラミングで言いたいこと聞きたいこと集プログラミングで言いたいこと聞きたいこと集
プログラミングで言いたいこと聞きたいこと集tecopark
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜勝成 鈴江
 

What's hot (20)

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

Viewers also liked

C++14 variable templates
C++14 variable templatesC++14 variable templates
C++14 variable templatesAkira Takahashi
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
 
テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式digitalghost
 
ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体ナウなヤングにバカうけのイカしたタグ付き共用体
ナウなヤングにバカうけのイカしたタグ付き共用体digitalghost
 
C++ tips2 インクリメント編
C++ tips2 インクリメント編C++ tips2 インクリメント編
C++ tips2 インクリメント編道化師 堂華
 
Learning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryLearning Template Library Design using Boost.Geomtry
Learning Template Library Design using Boost.GeomtryAkira Takahashi
 
C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編C++ tips 3 カンマ演算子編
C++ tips 3 カンマ演算子編道化師 堂華
 
インフラエンジニアがUnityをやるべきたった一つの理由
インフラエンジニアがUnityをやるべきたった一つの理由インフラエンジニアがUnityをやるべきたった一つの理由
インフラエンジニアがUnityをやるべきたった一つの理由axsh co., LTD.
 

Viewers also liked (16)

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

Similar to C++0x concept

Lambda in template_final
Lambda in template_finalLambda in template_final
Lambda in template_finalCryolite
 
T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!Shohei Okada
 
規格書で読むC++11のスレッド
規格書で読むC++11のスレッド規格書で読むC++11のスレッド
規格書で読むC++11のスレッドKohsuke Yuasa
 
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7Tetsuya Morimoto
 
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-
タイムマシン採用:明日のエンタープライズJavaの世界を予想する -Java EE7/クラウド/Docker/etc.-Takakiyo Tanaka
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例Yoshifumi Kawai
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#信之 岩永
 
How We UITest with GraphQL
How We UITest with GraphQL How We UITest with GraphQL
How We UITest with GraphQL hayato iida
 
Python standard 2022 Spring
Python standard 2022 SpringPython standard 2022 Spring
Python standard 2022 Springanyakichi
 
プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~
プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~
プラグイン作者脳になろう ~実案件で学ぶプラグイン開発フロー~Takeuchi Yuichi
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
DB TechShowcase Tokyo - Intelligent Data Platform
DB TechShowcase Tokyo - Intelligent Data PlatformDB TechShowcase Tokyo - Intelligent Data Platform
DB TechShowcase Tokyo - Intelligent Data PlatformDaiyu Hatakeyama
 
CAP Custom Handlers をクリーンにしよう
CAP Custom Handlers をクリーンにしようCAP Custom Handlers をクリーンにしよう
CAP Custom Handlers をクリーンにしようksugi
 

Similar to C++0x concept (20)

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

More from Akira Takahashi

More from Akira Takahashi (20)

Cpp20 overview language features
Cpp20 overview language featuresCpp20 overview language features
Cpp20 overview language features
 
Cppmix 02
Cppmix 02Cppmix 02
Cppmix 02
 
Cppmix 01
Cppmix 01Cppmix 01
Cppmix 01
 
Modern C++ Learning
Modern C++ LearningModern C++ Learning
Modern C++ Learning
 
cpprefjp documentation
cpprefjp documentationcpprefjp documentation
cpprefjp documentation
 
Boost tour 1_61_0
Boost tour 1_61_0Boost tour 1_61_0
Boost tour 1_61_0
 
error handling using expected
error handling using expectederror handling using expected
error handling using expected
 
Boost tour 1.60.0 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
Boost tour 1.60.0
Boost tour 1.60.0Boost tour 1.60.0
Boost tour 1.60.0
 
Boost container feature
Boost container featureBoost container feature
Boost container feature
 
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 mergeBoost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
 
Boost Tour 1_58_0
Boost Tour 1_58_0Boost Tour 1_58_0
Boost Tour 1_58_0
 
C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
 
C++14 enum hash
C++14 enum hashC++14 enum hash
C++14 enum hash
 
Multi paradigm design
Multi paradigm designMulti paradigm design
Multi paradigm design
 
Start Concurrent
Start ConcurrentStart Concurrent
Start Concurrent
 
Programmer mind
Programmer mindProgrammer mind
Programmer mind
 
Boost.Study 14 Opening
Boost.Study 14 OpeningBoost.Study 14 Opening
Boost.Study 14 Opening
 
Executors and schedulers
Executors and schedulersExecutors and schedulers
Executors and schedulers
 
Improvement future api
Improvement future apiImprovement future api
Improvement future api
 

C++0x concept