概要 従来の関数宣言構文では、戻り値の型は先頭に記述していた。 C++11から、戻り値の型をパラメータリストの後ろに記述する関数宣言構文が追加された。これにより、戻り値の型の文脈で、パラメータの変数を使用できる。 戻り値の型を後置するには、関数宣言の先頭にautoを書き、パラメータリストの後ろに->記号を書き、その後ろに戻り値の型を書く。ここでのautoは、「後ろに書いた戻り値の型を、autoと書いたところに置き換えて使用する」というプレースホルダーを意味する。 // int f() と同じく、戻り値の型としてintを返す関数 auto f() -> int { return 42; } // パラメータの変数aとbを+演算子で足し合わせた結果の型を、 // 関数g()の戻り値型とする auto g(int a, int b) -> decltype(a + b) { return a +
はじめに お久しぶりです。KMC OB の id:nojima です。 この記事は KMC Advent Calendar 2014 の10日目の記事です。 昨日は id:murata さんの「受験生応援!Javascriptでひねくれ数列」 でした。 今日は C++ の unique_ptr の話です。 (最初は rvalue について書こうと思っていたのですが、書いてみると unique_ptr だらけになったのでタイトルを変えました。なので、KMC Advent Calendar 2014 に書いてあるタイトルとは食い違っています。すみません) 個人的には C++03 ではなく C++11 を使う最大の理由は unique_ptr の存在だと思っています。 例外発生時にももれなく delete してくれる。 生ポインタとパフォーマンスが同じ。(最適化されている場合) 所有権を型として
I'm currently looking for a way to get backtrace information under Windows, from C code (no C++). I'm building a cross-platform C library, with reference-counting memory management. It also have an integrated memory debugger that provides informations about memory mistakes (XEOS C Foundation Library). When a fault occurs, the debugger is launched, providing information about the fault, and the mem
ミューテックスを自動的にアンロックするためのstd::lock_guardクラスとstd::unique_lockクラスでは、そのコンストラクタでいくつかのロック方法を提供しています。 1. 何も指定しない まず、何も指定しない場合。この場合、ミューテックスクラスのlock()メンバ関数を使用してロックの取得が行われます。これはstd::lock_guardとstd::unique_lockの両方でサポートされています。 #include <iostream> #include <mutex> int main() { std::mutex mtx; { std::unique_lock<std::mutex> lk(mtx); // lock()が呼ばれる // 共有リソースにアクセス... } // unlock()が呼ばれる } 2. defer_lock std::defer_lo
C++ を書いていて、初心者なのでいろんなことにつまづきます。先日も、リンクエラーに2時間ほど苦しめられていました。 以下がサンプルコードです。コードはあくまでサンプルなので気になさらず。 // MyModule.h #include <list> class MyModule { public: static void push(int value); static int pop(); private: static std::list<int> store; }; // MyModule.cpp #include "stdafx.h" #include "MyModule.h" void MyModule::push(int value) { MyModule::store.push_back(value); } int MyModule::pop() { std::list<int
stricmp問題 - 檜山正幸のキマイラ飼育記 メモ編 の件。 共通インクルードファイルのなかで、#include されていた。このため、共通インクルードファイルを直接・間接にインクルードしているファイル(すべてのソースファイル)で、 #include "common.h" // 間接的かも #ifdef __STRICT_ANSI__ #undef __STRICT_ANSI__ #endif #include <string.h> となっていると、既にstring.hがインクルードされ、かつインクルードガードがかかってしまう。下のNOT strict ANSIのインクルードは無視される。 #ifdef __STRICT_ANSI__ #undef __STRICT_ANSI__ #endif #include <string.h> #include "common.h" // 間接的
C#の拡張メソッドやRubyのオープンクラス、Swiftのextension、Objective-Cのカテゴリーの活用例に近い感覚のものを実現させます。 既存のクラスにメソッド(メンバ関数)を追加する方法と関数(フリー関数)で代替する方法、演算子の多重定義を活用する方法の3種類の方法を紹介します。 フリー関数(例:print(std::string("s"));) 演算子関数(例:std::string("s")-print;) メンバ関数(例:std::string("s").print();) オススメはフリー関数版の利用です。その他のイディオムは扱いが難しく、実用性には難があります。 フリー関数 もっとも簡単で手軽な方法です。 フリー関数の第一引数にオブジェクトの参照を渡し、その参照値を元に関数内で独自処理を記述していきます。 void print(const std::string
C++でオブジェクト生成時 #include "watch.hpp" int main( int argc, char** argv ) { Watch watch(); watch.start(); // なんか処理 watch.stop(); std::cout << "計算時間 : " << watch.getInterval() << " sec" << std::endl; return 0; } ↑みたいにしたら怒られた↓ g++ -c file.cpp file.cpp: In function ‘int main(int, char**)’: file.cpp:25: error: request for member ‘start’ in ‘watch’, which is of non-class type ‘Watch()’ file.cpp:27: error: r
Programming Place Plus へようこそ。 当サイトはプログラミングに関する学習サイトで、現在はC言語と C++ を扱っています。 プログラミングの入門~中級(自分でプログラミングできるレベル)までをサポートすることを目指して、コンテンツを作成、更新しています。 最近行われた更新を、ここから確認できます。 お知らせ ’2023/4/30 次月から、参考書籍に本を追加するタイミングを、最終土曜日に変更します ’2023/4/23 「セール情報」のページを追加しました 参考書籍 で紹介している本を中心に、お買い得情報を取り上げます(週1回程度の更新予定) ’2023/1/29 オフライン版を更新しました ’2022/6/12 「今後の予定」を更新しました コンテンツ Programming Place Plus のコンテンツです。最近行われた更新はこちら。 以下の検索窓から、す
STLやBoostにおいて関数ポインタを使っていると,恐らく「オーバーロードした関数へのポインタはどうやって取得するのか?」,もしくは「関数テンプレートへのポインタはどうやって取得するのか?」という問題にハマるかと思います.規格にはこれに関する記述が明確にあるのですが,マイナーな問題と思われているようで,この問題に関する(少なくとも日本語の)記述はほとんど見かけません. 以下,この問題について説明します. [C++]オーバーロードされた関数へのポインタ オーバーロードされた関数へのポインタ(この表現は実際には不適切ですが)を取ることを考えます. int f(int i){ return i; } double f(double d){ return d; } int (*pfi)(int) = &f;ここで注目すべきは&fという式で,この式,結果に型が存在しません.&fのままではint (
GCCのプリプロセッサの便利な拡張を知ったのでメモ。 関数形式マクロの引数の数は固定、というのはよく知られていると思うけど、現在のC言語(C99)ではサポートされている。 // (1) #define DEBUG_PRINT(...) printf(__VA_ARGS__)C++の仕様には入っていないけど、まあGCCではC++でも使えている。 ただ、__VA_ARGS__ はすこし凝ったことをするには限界があることを最近知った。例えば、この DEBUG_PRINT() の表示に関数名を追加したいとする。 // (2) #define DEBUG_PRINT(fmt, ...) \ printf("%s(): "fmt, __func__, __VA_ARGS__)__func__ は関数名の文字列を指す特別な識別子で、これもC99。マクロに似ているけどマクロではないので、__FILE__や
ビルド時の依存関係を無理矢理にでも減らそうという考えのもと、CUnitクラス、CPlayerクラス、CEnemyクラスをテンプレートクラスにしてCGameMaster.hをインクルードしなくて済むようにしようという目論見。 まずCUnitをテンプレートクラスにし、CPlayerとCEnemyはそれを継承すればok、なはず。が、何も考えずにCUnitに template <class T> をくっつけていくもビルド失敗。 手持ちの入門書にはテンプレートクラスの継承方法は載っていなかったので簡単なテストコードを書いて確認。 #include <iostream> // -----template <class T> class TP_BASE { protected: int m_x; public: TP_BASE() :m_x(0) {} virtual ~TP_BASE() {} vir
仕事(24) ---- 釣り ----(51) ---- はっかー ----(30) C言語関連(22) ---- 音楽 ----(34) ---- ゲエム ----(55) OverWatch(1) 音ゲー(15) 将棋(11) AoC(15) Lineage2(204) モンハン(14) ---- いろいろ ----(291) 食べ物・飲み物・植物(92) 茶葉評論(15) おしゃれ(1) 旅行(6) モンハンクロス 上位突入 by waybenj (12/21) TuxGuitar が動かない by 千ノ丸 (03/25) 浮島つり園 by ちはや (09/09) 浮島つり園 by ランカたんハァハァ (09/04) ビッグシーバス!! by ゆき (06/04) C++における関数のオーバーライド、ポリモーフィズムは 知ってる人には常識だけど他のオブジェクト指向言語の人は悩む事が多
dereferencing type-punned pointer will break strict-aliasing の警告を回避する方法. C/C++では,以下のようなType-punned pointerを使うコードは,厳密には動作が保証できない. float f = 123; uint32_t u = *(uint32_t*)&f; このようなコードは,例えば GCCで "-O3 -Wall"のようなオプションを付けてコンパイルすると dereferencing type-punned pointer will break strict-aliasing という警告が出る.理由は,以下のURLあたりが詳しい. http://d.hatena.ne.jp/sumii/20071115/p2 http://www29.atwiki.jp/akcnv/pages/30.html#id_
実際に確認してみます。 #include <cstdio> #define PRINT_OBJ(obj) \ printf("%-10s: %08x, %-16s: %2d\n",\ "&"#obj,\ 0,\ "sizeof("#obj")",\ sizeof(obj)); #define PRINT_FIELD(obj, field) \ printf("%-10s: %08x, %-16s: %2d\n",\ "&"#obj"."#field,\ value(&obj.field) - value(&obj),\ "sizeof("#obj"."#field")",\ sizeof(obj.field)); namespace { class Base { public: int a; short b; float c; char d; }; class Sub : public B
Return Value Optimization (RVO) の話 この記事は、今年もやります!KMCアドベントカレンダー!! - KMC活動ブログの20日目の記事です。 昨日の19日目の記事はRustは開発中だけど面白い!【KMCアドベントカレンダー19日目】 - KMC活動ブログでした。 KMC3回生のhatsusatoです。 当初はC++のrvalue周りの話をしようと考えていたのですが、rvalueの解説記事は他にたくさんあるしなあ……、と渋っていたら天啓が来たのでRVOの話をします。 RVOとは Return Value Optimization (RVO)とは、C++におけるコンパイラ最適化技術の名前です。 その名の通り、関数の戻り値に対して余分なコピーや一時オブジェクトを削減する最適化を施します。 コピーコンストラクタには副作用のある処理を書くこともできるので、コピーを削減
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く