タグ

関連タグで絞り込む (2)

タグの絞り込みを解除

C++0xに関するeagletmtのブックマーク (10)

  • コンストラクターのデリゲート

    C++0xにおけるコンストラクターのデリゲートのメモ。 class X { public : X() { // 共通の初期化処理 } X( int value ) { // 共通の初期化処理 // 引数を使った追加の処理 } } ; この例では、どちらのコンストラクターも、初期化処理は共通している。同じコードが重複するのは、バグの下である。こういう場合、C++03では、共通の処理をメンバー関数に移すことができる。 class X { private : void init() ; public : X() { init() ; } X( int value ) { init() ; // 引数を使った追加の処理 } } ; しかし、この方法では、非staticデータメンバーをコンストラクター初期化子で初期化することはできない。それに、結局init関数を呼び出さなければならないことにはかわり

  • constexpr関数とテンプレートについて

    Twitter / 妖精闇姫 非実在えつえつしーりつく: @kikairoya http://ideone.c ... Twitter / 妖精闇姫 非実在えつえつしーりつく: template の行を削るとちゃんと(?)コンパイ ... Ideone.com | Online C++0x Compiler & Debugging Tool 以下のコードを考える。 int g = 0; template< typename T = void > constexpr int f() { return g; } int main() { std::cout << f() << std::endl; // 0 g = 1; std::cout << f() << std::endl; // 1 } これは、一見すると、constexpr関数で、定数でもないstatic変数gを、constexpr

  • 関数のテンプレート引数を明示的に書いたかどうかで分岐する - melpon日記 - HaskellもC++もまともに扱えないへたれのページ

    こんな感じ。 #include <iostream> template<class T> struct identity { typedef T type; }; template<class T> void f(typename identity<T>::type) { std::cout << "type T" << std::endl; } template<class T, class... Types> void f(T, Types...) { std::cout << "deduced" << std::endl; } int main() { f<int>(10); f(10); } type T deduced明示的に書いたときは両方の関数が候補に挙がって、f(T) と f(T, Types...) なら f(T) の方が優先されるので前者が呼ばれて、明示的に書かなかった

    関数のテンプレート引数を明示的に書いたかどうかで分岐する - melpon日記 - HaskellもC++もまともに扱えないへたれのページ
  • lambdaでデータメンバーのキャプチャー

    まず始めに明言しておくと、lambda式でデータメンバーはキャプチャーできない。lambda式は、ローカル変数しかキャプチャできない。従って、このブログのタイトルは、すでに間違っている。ではなぜこんなタイトルなのか。それは。lambda式では、データメンバーを使うことが出来るからだ。これは、誤解されやすい。 struct C { int x ; void f() { [=]{ return x ; } ; } } ; これは、完璧にwell-formedなC++0xのコードである。ご覧のように、データメンバーが使える。「ほれ見ろ使えるじゃねぇか。するてぇと、データメンバーもキャプチャーできるに違ぇねぇ」と思われるかもしれない。しかし、データメンバーは、キャプチャーできない。 では、このlambda式は、何をキャプチャーしているのか。thisである。上の例は、以下のように書くこともできる。

  • Variadic Template Parameterの落とし穴

    Variadic Template Parameterの型引数のことを、テンプレートパラメーターパック(Template Parameter Pack)という。 template < typename ... Types > struct Foo { } ここでは、Typesは、テンプレートパラメーターパックである。 テンプレートパラメーターパックを、関数の引数に取る場合、これを、パラメーターパックという。 template < typename ... Types > void f( Types ... args ) { } ここでは、argsは、パラメーターパックである。 クラステンプレートの場合、テンプレートパラメーターパックは、必ず、テンプレートパラメーターリストの最後に書かなければならない。 // well-formed template < typename T, typena

  • 本の虫: C++0xの新しい乱数ライブラリ、random

    注意:最新ドラフトのN3000のrandomの規定は、コンセプトが却下される前の文面であり、今後、変更があると思われる。 C++は標準ライブラリが貧弱であるとは、よく言われることだ。ことに、乱数に関しては、貧弱の極みである。ご存じのように、C++は、Cから標準ライブラリを引き継いでいる。rand()だ。これは、0からRAND_MAXまでの値を返すと規定されている。RAND_MAXは実装によって異なるが、ほとんどの処理系では、32767である。現代の乱数需要を満たすには、あまりにも小さすぎる。 この状況を打破すべく、C++0xには新しい乱数のライブラリが盛り込まれた。randomである。これはBoostの実装を元にしているのだが、Boostとは少し違っている。今回はそのrandomを、浅く触りだけ紹介しようと思う。というのも、ライブラリの細かなメンバ関数の一つ一つまで説明するのは、甚だ冗長で

  • 本の虫: lambda 完全解説

    目的 この記事は、C++0xのlambdaを完全に解説せんとする目的を以て書かれた。サンプルコードは最小に留め、エラー処理等は省いた。この記事さえ読めば、今日からlambdaを恐れることなく使う物のC++0xプログラマになれるだろう。 lambdaとは何ぞや lambdaである。あるものは、lambda関数、あるいは無名関数という名称を使っている。いったいlambdaとは何なのか。 lambdaは関数である。また、特に名前はない。したがって、lambda関数、無名関数と呼ぶのは、間違ってはいない。しかしここでは、単にlambdaと呼ぶことにする。 lambdaを定義しよう lambdaは関数オブジェクトである。lambdaは関数オブジェクトである。これはとても大事なので二度書いた。lambdaは関数オブジェクト以外の何物でもない。ところが不思議なことに、皆lambdaが単なる関数オブジェ

  • 本の虫: rvalue reference 完全解説

    目的 この記事は、C++0xのrvalue referenceを完全に解説せんとする目的を以て書かれた。サンプルコードは最小に留め、エラー処理等は省いた。この記事さえ読めば、今日からrvalue referenceを恐れることなく使う物のC++0xプログラマになれるだろう。 lvalueとrvalueについて Cの時代では、lvalueとrvalueの違いは、代入演算子の左側か右側かという違いだけであった。つまり、left hand value, right hand valueの略である。従って、訳語も、左辺値、右辺値であった。C++においては、これはもはや正しくはない。従って、右辺値、左辺値というのも、誤訳である。それ故に、ここでは、これ以上、左辺値、右辺値という名称を使用しない。 誤解を恐れずにいえば、lvalueとは、明示的に実体のある、名前付きのオブジェクトであり、rvalue

  • 本の虫: decltypeの訓練

    こんにちは、脳内に優れたC++0xコンパイラをインストール済みのみなさん。今回は、あなたの脳内コンパイラが規格準拠かどうかを、さらにテストしてみましょう。 まずは、decltypeの決まりごとからです。優秀なみなさんのことですから、decltypeの決まりごとぐらい、当然暗記しているのは分かっていますが、念のために引用しておきます。 The type denoted by decltype(e) is defined as follows: — if e is an unparenthesized id-expression or a class member access (5.2.5), decltype(e) is the type of the entity named by e. If there is no such entity, or if e names a set of

  • decltypeの二重括弧が参照になる理由

    こんにちは。みなさんのような優秀なプログラマなら、C++0xコードの脳内コンパイルぐらい普通に行っていると思うのですが、何しろC++0xの型システムは厄介です。そこで今回は、皆さんの脳の規格準拠度を調べてみることにしましょう。 C++0xにはdecltypeがあります。delctypeも知らないようでは、もはやC++0xプログラマとしては恥ずかしくて人前を歩けません。ところが、decltypeは悉達多プログラマには、少々難しいのです。 以下のコード辺を脳内コンパイルしたとき、皆さんの脳内には、どのような型情報が構築されているでしょうか int e ; #1 decltype(e) ; // #2 decltype((e)) ; // #3 まず、#1で、eの型は、当然intです。次のコードが脳内コンパイル可能かどうかは、皆さんの脳内コンパイラのバージョンによっても異なるのですが、今時C++

  • 1