テンプレート使うとヘッダが肥大化してコンパイル&リンク時間が爆発する! なんとかして! という問題への対処法です。 コードはこちら: http://gist.github.com/640298 以下、解説…ですが、しっかりした解説を書くのは面倒なので、箇条書き程度に。 基本アイデアとしては、実装の詳細は非テンプレートの実装用クラスの内部クラスに隔離し、テンプレートはその薄いラッパにすることによって、ヘッダから実装を取り除く、というものです(thin template 技法)。 通常の thin template では、非テンプレートの実装用クラスのメンバ構成までは秘匿できませんが、そこを pImpl にすることで、ほぼ完全に実装を秘匿できます。 ただし一点、メモリ管理だけは秘匿しにくいので、そこは boost::shared_ptr を使って「型を消す」ことで対処しています( shared
使ってみました。 Boostのlibs/asio/example/http/server4にあるcoroutine.hppとyield.hppを持ってきます。 まず、非メンバ関数でのyield。 #include <iostream> #include "yield.hpp" int foo(coroutine& coro) { reenter(coro) { yield return 1; yield return 2; } } int main() { coroutine coro; std::cout << foo(coro) << std::endl; std::cout << foo(coro) << std::endl; } 1 2 メンバ関数内でのyield。coroutineクラスを継承してreenterにthisを渡すか: #include <iostream> #inc
何の気なくのぞいてみたら、2chって宝の山なのですね。 過去スレとかにも面白い書き込みがたくさんあり、幾つかがdatに行く前にこうやって張れたらと思います。 91 名前: デフォルトの名無しさん 投稿日: 2007/09/30(日) 20:19:13 クラスの内側で定義したクラステンプレートを特殊化する、 class X { template<typename T> class Y {}; template<> class Y<int> {}; }; のようなコードは、VC++(2003/2005)ではコンパイルできますが、g++3/4では error: explicit specialization in non-namespace scope ‘class X’ というエラー になってしまいます。 YをXの中ではなく、名前空間スコープで template<> class X::Y {}
Boost 1.44.0で、decltypeベースでのboost::result_ofの実装が入ったので試してみました。 #define BOOST_RESULT_OF_USE_DECLTYPE #include <type_traits> #include <boost/utility/result_of.hpp> struct plus_functor { // typedef int result_type; int operator()(int a, int b) const { return a + b; } }; int main() { static_assert(std::is_same<boost::result_of<plus_functor(int, int)>::type, int>::value, "not same"); } このコードは、GCC 4.5では動作
まだC, C++がないようなので書いてみた。主にLinux(DebianとかUbuntu)での環境構築について。 コンパイラ まずはapt-getでコンパイラをインストールする。UbuntuやDebianなら以下のコマンドでgccやg++および標準ライブラリ等がインストールされる。 $ sudo apt-get install build-essential デバッグツール デバッガおよびデバッグツールは少なくとも以下の三つは入れる。(あとltraceも欲しいかな?) GDB 言わずと知れたGNUのデバッガ Valgrind メモリリークや不正メモリアクセスの検出 strace システムコールのトレース $ sudo apt-get install gdb valgrind strace ビルドツール C, C++のビルドツールといえばまずmakeが浮かぶけど、最近ではSConsやCMak
ATLライブラリ等で使用されている、自ポインタを基底クラスに渡すC++のtemplateの手法を説明します。 ※)動作確認はVC8(VisualStudio2005)で行いました。 クラスを継承して振る舞いを変えたい場合は、仮想クラスにして変更したい関数を継承先でOverWriteするのが普通ですが、CRTPを使用すれば仮想クラスにせずとも継承先で処理の変更をすることが可能です。 ではどう言う時にそのような事を発生させたいかと言うと、下記の2点ではないかと思います。 ・動的に継承先クラスを切り替えるのではなく、コンパイル時に型が確定している時。 ・インライン展開を行いたい時。 普通の場合ですと可読性を優先して、上記の場合でも仮想クラスとすべきなのでしょうが、色々制約が出てきた場合に今回の仕組みを知っていると楽になる場合が多々あると思います。 基底クラス(template) /** * 共通
自己言及的なテンプレート (その2) 以前、「自己言及的なテンプレート」 という記事を書いたが、今回はその補足である。 前回、事前に定義されているテンプレートで使用したのは、 最終的に定義されるクラスのポインタだけだったので、 template<class T> class X { public: T* foo() { } }; class A : public X <A> { }; このような自己言及的な書き方が可能なのだと思っていた。 でも、実は次のような使い方も可能なのであった。 template<class T> class X { public: static size_t getSize() { return sizeof(T); } }; class A : public X <A> { int x; }; int main() { cout ここでは、class A の本
The latest reviewed version was checked on 9 November 2024. There are template/file changes awaiting review. C++ has indeed become too "expert friendly" -- Bjarne Stroustrup, The Problem with Programming, Technology Review, Nov 2006. Stroustrup's saying is true because experts are intimately familiar with the idioms in the language. With the increase in the idioms a programmer understands, the lan
Jeremy founded Tag1 Consulting in 2007. He has been a contributing core Drupal developer since 2002, and helped establish Drupal as a successful CMS through the early popularity of his personal blog, KernelTrap.org. Over the years, he authored and maintained the core statistics module and throttle module, as well as the pager logic and the initial Drupal 5 installer. He continues to contribute to
“libc++” C++ Standard Library¶ Overview¶ libc++ is a new implementation of the C++ standard library, targeting C++11 and above. Features and Goals Correctness as defined by the C++11 standard. Fast execution. Minimal memory use. Fast compile times. ABI compatibility with gcc’s libstdc++ for some low-level features such as exception objects, rtti and memory allocation. Extensive unit tests. Design
std::for_eachにループカウンタを入れる方法 - 名古屋313の日記 元ネタの質問というのがどういうものなのか見てないですけど、 よくある要望としては、for_eachでコンテナの要素とループカウンタの両方がほしい、というところじゃないかと思います。 この要望に対する回答としては、以下のように、RangeとCounting Rangeを綴じ合わせ、 要素にループカウンタの情報を付加する、というものになります。 Ovenの場合はcountingとzippedを使う #include <iostream> #include <vector> #include <pstade/oven/algorithm.hpp> #include <pstade/oven/initial_values.hpp> #include <pstade/oven/zipped.hpp> #include <
変数の immutability に関する議論、今に始まった話でもないんでしょっちゅう見かけるには見かけるんですけど、まとめ的な話はあんまりきれいにまとまってるところ見かけないなぁとか思ったり。 というので、まだそんなにきれいに整理できてるわけでもないけど、ちょっと書いてみる。 値の不変性 値の不変性にもいくつか種類があって、 constant: コンパイル時定数に名前を付けておきたい 扱いが完全にリテラルと一緒になるやつ C# の const C++ の場合、#define の代替としての const ようは、パフォーマンス的な話で、コンパイル時に解決できる値は全部コンパイル時にやっちゃいたいって話 ぶっちゃけ、リテラルが定義できるようなものだけ const 付けれればいいのかなぁと C# の場合、整数型と string と enum だけが const になれる C++ は逆に、con
Download Cinder is available under the BSD License for macOS and Windows. The latest version is 0.9.2 Cinder for macOS Visual C++ 2015 All Cinder Versions Github To keep up-to-date with Cinder’s development, consider working from the github repository directly. This guide walks you through getting setup with Cinder and Github. Cinder on GitHub Sponsors Cinder is developed by the generous contribut
Visual StudioのC++開発環境ではsizeof(wchar_t) == 2なのでstd::wstringではサロゲートペアを考慮する必要があります. それを避けるためにUTF32文字列で文字列処理を行いたい場合があると思います.その場合, typedef unsigned int uint32_t; typedef std::basic_string<uint32_t> u32stirng; などの定義をして文字列を使うことになるでしょう.これらの型はC++0xでは標準になる予定です. 実際には利便性のためにchar*との自然な変換メソッドなどを追加すると思いますが,ここでは省略します. boost::regexでもstd::stringと同様にテンプレートパラメータに文字の型を与えることができ, typedef boost::basic_regex<uint32_t> u32
10年以上前、Bjarne Stroustrup博士の偽インタビュー記事(又はパロディとも言う)がネット上で出回ったことがありました。C++の人ならよく御存知だと思います。幸いにもこことかここに、その和訳があります。その当時、これを本当のインタビューだと信じる(もしくは信じたい?)人が少なからずいて、鬼の首を取ったかのように自身のサイト(まだブログが流布する前なので)上で論評し、勝利宣言(?)か何かのように勝ち誇ったことがありました。どこの国かを言及すると、また私の愛国精神云々する単純細胞な人がいらっしゃいますので、あえて言いません。残念ながら、それらのサイトは当り前ですが削除、改訂されて、もう見ることは出来ません。 私が最初に原文を読んだ時、(今だから言うのではありません)偽だと思いました。日頃から博士の原文(書き言葉であろうが話し言葉であろうが)を読み慣れている人ならば、内容の吟味をす
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く