C++0x concept

Akira Takahashi
Akira TakahashiProgrammer en Preferred Networks, Inc.
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
1 de 50

Recomendados

C++ Template Metaprogramming por
C++ Template MetaprogrammingC++ Template Metaprogramming
C++ Template MetaprogrammingAkira Takahashi
5.1K vistas11 diapositivas
Effective Modern C++ 勉強会#1 Item3,4 por
Effective Modern C++ 勉強会#1 Item3,4Effective Modern C++ 勉強会#1 Item3,4
Effective Modern C++ 勉強会#1 Item3,4Takashi Hoshino
2.7K vistas24 diapositivas
C++0x 言語の未来を語る por
C++0x 言語の未来を語るC++0x 言語の未来を語る
C++0x 言語の未来を語るAkira Takahashi
1.7K vistas40 diapositivas
templateとautoの型推論 por
templateとautoの型推論templateとautoの型推論
templateとautoの型推論MITSUNARI Shigeo
15.2K vistas22 diapositivas
Emcpp0506 por
Emcpp0506Emcpp0506
Emcpp0506Takatoshi Kondo
10.7K vistas15 diapositivas
Template Meta Programming入門から応用まで por
Template Meta Programming入門から応用までTemplate Meta Programming入門から応用まで
Template Meta Programming入門から応用までyoshihikoozaki5
12.2K vistas417 diapositivas

Más contenido relacionado

La actualidad más candente

最新C++事情 C++14-C++20 (2018年10月) por
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)Akihiko Matuura
1.7K vistas39 diapositivas
魂のコーディング por
魂のコーディング魂のコーディング
魂のコーディングDaisuke Tasaki
2.3K vistas28 diapositivas
知って得するC# por
知って得するC#知って得するC#
知って得するC#Shota Baba
9.7K vistas50 diapositivas
C++ Template Meta Programming の紹介@社内勉強会 por
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
9.4K vistas59 diapositivas
C#coding guideline その2_20130325 por
C#coding guideline その2_20130325C#coding guideline その2_20130325
C#coding guideline その2_20130325Yoshihisa Ozaki
3.6K vistas71 diapositivas
unique_ptrにポインタ以外のものを持たせるとき por
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときShintarou Okada
6.9K vistas28 diapositivas

La actualidad más candente(20)

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

Destacado

Boost tour 1_61_0 merge por
Boost tour 1_61_0 mergeBoost tour 1_61_0 merge
Boost tour 1_61_0 mergeAkira Takahashi
2K vistas126 diapositivas
C++1z draft por
C++1z draftC++1z draft
C++1z draftAkira Takahashi
6.6K vistas67 diapositivas
Boost Fusion Library por
Boost Fusion LibraryBoost Fusion Library
Boost Fusion LibraryAkira Takahashi
2.7K vistas38 diapositivas
C++14 variable templates por
C++14 variable templatesC++14 variable templates
C++14 variable templatesAkira Takahashi
5.7K vistas18 diapositivas
C++コンパイラ GCCとClangからのメッセージをお読みください por
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいdigitalghost
4.7K vistas12 diapositivas
テンプレートメタプログラミング as 式 por
テンプレートメタプログラミング as 式テンプレートメタプログラミング as 式
テンプレートメタプログラミング as 式digitalghost
2K vistas17 diapositivas

Destacado(16)

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

Similar a C++0x concept

What is template por
What is templateWhat is template
What is templateAkira Takahashi
2.9K vistas32 diapositivas
Lambda in template_final por
Lambda in template_finalLambda in template_final
Lambda in template_finalCryolite
4.4K vistas72 diapositivas
T69 c++cli ネイティブライブラリラッピング入門 por
T69 c++cli ネイティブライブラリラッピング入門T69 c++cli ネイティブライブラリラッピング入門
T69 c++cli ネイティブライブラリラッピング入門伸男 伊藤
5.2K vistas65 diapositivas
PHP 2大 web フレームワークの徹底比較! por
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!Shohei Okada
13.4K vistas82 diapositivas
20120118 titanium por
20120118 titanium20120118 titanium
20120118 titaniumHiroshi Oyamada
1.9K vistas32 diapositivas
Boost tour 1_40_0 por
Boost tour 1_40_0Boost tour 1_40_0
Boost tour 1_40_0Akira Takahashi
2.5K vistas85 diapositivas

Similar a C++0x concept(20)

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

Más de Akira Takahashi

Cpp20 overview language features por
Cpp20 overview language featuresCpp20 overview language features
Cpp20 overview language featuresAkira Takahashi
891 vistas28 diapositivas
Cppmix 02 por
Cppmix 02Cppmix 02
Cppmix 02Akira Takahashi
675 vistas7 diapositivas
Cppmix 01 por
Cppmix 01Cppmix 01
Cppmix 01Akira Takahashi
1K vistas11 diapositivas
Modern C++ Learning por
Modern C++ LearningModern C++ Learning
Modern C++ LearningAkira Takahashi
18.5K vistas12 diapositivas
cpprefjp documentation por
cpprefjp documentationcpprefjp documentation
cpprefjp documentationAkira Takahashi
1.3K vistas23 diapositivas
Boost tour 1_61_0 por
Boost tour 1_61_0Boost tour 1_61_0
Boost tour 1_61_0Akira Takahashi
1.4K vistas14 diapositivas

Más de Akira Takahashi(20)

Cpp20 overview language features por Akira Takahashi
Cpp20 overview language featuresCpp20 overview language features
Cpp20 overview language features
Akira Takahashi891 vistas
C++14 solve explicit_default_constructor por Akira Takahashi
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
Akira Takahashi7.3K vistas

C++0x concept