C++

配列の make_shared

C++0x の std::shared_ptr を使う場合は, std::make_shared を使うことによって,普通にポインタを new する場合より効率が良く,また安全なコードが書けます: int main() { auto p = std::make_shared<std::string>( "hoge" ); // std::shared_ptr<std::string> p( new std::string(</std::string></std::string>…

Perfect Forward を行ってくれるマクロ

C++0x の Perfect Forward は,便利なのですが,イチイチ変数の型名を指定しなきゃいけないのが面倒です: #include <utility> template< class T, class U > auto add( T && x, U && y ) -> decltype( std::forward<T>(x) + std::forward<U>(y) ) { return std::forward<T>(x)</t></u></t></utility>…

constexpr な boost::addable

元ネタ: http://d.hatena.ne.jp/nagoya313/20110718/1311002272 * * * なにジョジョ? operator+= から operator+ を生成すると constexpr にできない? ジョジョ それは operator+= を使うからだよ __.. -―─ 、__ /` 三ミー ヘ、_ ゝ' ;; ,, , ,, ミミ , …

multiple_lock_guard で型推論する

元ネタ: http://cpplover.blogspot.com/2011/06/multiplelockguard.html いちいち multiple_lock_guard とか書くのは面倒なので, 関数にして auto で束縛できるようにしてみました. なお,テスト等は全く行っていないので,使う場合は自己責任でお願いし…

GCC-4.6.1 がリリースされた

gcc の最新版, gcc-4.6.1 がリリースされたようです: http://gcc.gnu.org/gcc-4.6/ ftp://gcc.gnu.org/pub/gcc/releases/gcc-4.6.1/ 今回のリリースはパッチなので,新しい機能は特に追加されていませんが, GCC-4.6.0 に存在していた多くのバグが修正され…

SFINAE in FDIS

今までのドラフトでは、 SFINAE ではアクセス制限は考慮されませんでした: class X { private: void f() {} }; #include <iostream> template< class T > auto f( T& x, int ) -> decltype( x.f() ) { return x.f(); } template< class T > void f( T&, ... ) { std::</iostream>…

FDIS の不満点

C++0x の FDIS について、細かい部分で幾つか不満な点が見つかったので、メモしておきます。本来なら FDIS を採択した Madrid meeting 以前に言うべきであった事ばかりで、機を逃した感じですが、 気づいておきながら何も主張しないよりはマシだと思ったので…

post-Madrid mailing が公開された

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/#mailing2011-04最新ドラフトは N3290, N3291 になったようです。 前者は FDIS で、このまま何事もなく承認されれば、そのまま国際標準となる版です。 後者は Working Draft で、今までのドラフト …

新しい enable_if を楽に使うマクロ ETUDE_ENABLE_IF を作ってみた

元ネタ: 本の虫「C++0xにおけるenable_ifの新しい使い方」 Boost の ML で、新しい enable_if の使い方が示されているようです: // Never defined extern void * enabler ; template < typename T, typename std::enable_if< std::is_arithmetic<T>::value >:</t>…

標準ライブラリにおける noexcept 指定の方針(メモ)

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3279.pdfにて、 C++0x の標準ライブラリにおける noexcept 指定の基準が示されたので、以下 適当に和訳。 デストラクタには例外指定を付けない。 その結果として、暗黙に指定された(例外を投げな…

noexcept を(半ば強引に)エミュレーションするマクロ

エミュレーションすると言っても、基本的に常時 false ですが: #include <boost/config.hpp> #ifdef BOOST_NO_NOEXCEPT // 今のところそんなマクロ無いけど #define NOEXCEPT(expr) ( sizeof( (void)( expr ), 0 ) < 0 ) #define NOEXCEPT_IF(expr) #define NOTHROW #else #de</boost/config.hpp>…

gcc-4.6.0 コンパイル通ったよ!

以下、テストコード: #include <vector> #include <memory> // for std::unique_ptr // implicit move struct X { X() = default; X( std::vector<int> src ) : p( new auto( std::move(src) ) ) {} // X( X&& ) = default; // noexcept-specification int* begin() noexcept(tru</int></memory></vector>…

gcc-4.6.0 がリリースされた

gcc の最新版 4.6.0 がリリースされたようです: http://gcc.gnu.org/gcc-4.6/ 気になる C++0x サポートですが、 g++ 4.6.0 では、新たに nullptr range-based for constexpr noexcept implicit move 等が追加されたようです。 http://gcc.gnu.org/projects/…

Boost.Optional Must Go (3)

関連記事: http://d.hatena.ne.jp/gintenlabo/20100531/1275335373 http://d.hatena.ne.jp/gintenlabo/20100602/1275505739 結論から言います。 以前の記事において、参照に対する Boost.Optional は、生ポインタの代替として使える、と書きましたが、 現状…

rvalue reference の不満点

C++0x には rvalue reference という機能があります。 これは「一時オブジェクトへの参照」を扱うものであり、 struct X { std::string s; // 一時オブジェクトが渡された場合、 s_ は自由に変更できる // なので、 s_ の中身を「移動」して s を初期化する …

Inheriting Constructors を Variadic Templates でエミュレートする

C++0x の規格制定において、 Inheriting Constructors を見直す提案がなされたようです: 本の虫: pre-Madrid mailingの簡易レビュー 曰く、 Inheriting Constructors (以下、 Constructor を Ctor と略記)は、 Variadic Templates でエミュレート可能であ…

Variadic Templates を SFINAE 用のダミー引数として使う

C++ では、ある関数に渡された引数の種類によって、実際に行う処理を切り替えたい時には、 #include <type_traits> template< class T, class = typename std::enable_if< std::is_integral<T>::value >::type > void f( T const& x ) { // T が整数型の場合 } template< cla</t></type_traits>…

関数テンプレートに対するデフォルトテンプレート引数の使い方

この記事は、新しい使い道が発見され次第、随時更新していく予定です。 はじめに C++0x では、関数テンプレートに対し、デフォルトのテンプレート引数を渡すことが出来るようになりました: http://d.hatena.ne.jp/faith_and_brave/20071105/1194259443 // …

Boost.勉強会 #4 で喋ってきました。

週末は Boost.勉強会 #4 に参加してきました。 なかなか興味深い発表が多かったので、興味ある方は http://d.hatena.ne.jp/osyo-manga/20110226/1298715364 辺りを参照してみるといいんじゃないでしょうか。 んで、一応僕も Boost.Optional について話してき…

range-based for

C++0x の規格制定で、範囲 for 構文をどうするかが議論になっているようです。 本の虫: range-based forに対する意見求む range-based for の変更案 - Togetter 僕としては、案4の「メンバ関数を呼び出す」が妥当かと思います。 というのも、 ADL というの…

auto によって束縛される変数の型(解答・解説編)

http://d.hatena.ne.jp/gintenlabo/20110220/1298187803の解答と解説です。

auto によって束縛される変数の型(出題編)

追記: 問題を追加して整理しました。 コメントにあった auto && に関しては、また後ほど触れたいと思います。 問 C++0x において、以下のコード int f(); int& g(); int&& h(); int main() { auto x0 = 0; int i = 1; auto x1 = i; int const j = 2; auto x…

C++0x における NRVO

C++0x において、関数の戻り値に、関数内部のローカル変数を「そのまま」帰す場合を考えます: std::string f() { std::string s = "hoge"; return s; } この場合、戻り値として使われるローカル変数 s は、自動的に move されます。 つまり、以下のコードは…

std::pair の range access がいつの間にか規格から消えていた件

cpprefjp の std::pair の項目を下書きしてて気がついたんですが、 いつの間にか std::pair の Range Access が規格から消えていました: std::multimap<int, std::string> m = { { 0, "hoge" }, { 1, "fuga" }, { 1, "piyo" }, { 2, "foo" }, }; // equal_range のような イテ</int,>…

ラムダ式の参照キャプチャは基本的に安全である

ラムダ式ネタをもう一つ。こっちは少々マニアックな内容です。 C++0x におけるラムダ式は、 int f( std::vector<int> const& v1, std::vector<int> const& v2 ) { int sum = 0; auto add_to_sum = [&](int x){ sum += x; }; std::for_each( v1.begin(), v1.end(), add_</int></int>…

ラムダ式の型を取得する

C++0x から新たに C++ に追加された要素に、ラムダ式というものがあります。 これは、ちょっとした関数を、その場で定義して使えるようにしたもので、 #include <vector> #include <numeric> #include <iostream> int main() { std::vector<double> v = { -1, 2, 1.5, -4 }; double prod = std::</double></iostream></numeric></vector>…

C++0x 標準ライブラリ完全解説 〜 No.03 std::move_if_noexcept,

該当規格: 20.3.3 forward/move helpers [forward], N3225 http://sites.google.com/site/cpprefjp/reference/utility/move_if_noexcept C++0x 標準ライブラリ完全解説の三回目です。 今回は解説することも少ないので、さっさと書いてしまうことにします。 …

C++0x 標準ライブラリ完全解説 〜 No.02 std::move,

該当規格: 20.3.3 forward/move helpers [forward], N3225 http://sites.google.com/site/cpprefjp/reference/utility/move 少し間隔があいてしまいましたが、 C++0x 標準ライブラリ完全解説の二回目です。前回の記事では、 C++98/03 の時点から変わらない…

std::forward は Perfect Forward にのみ使われるとは限らない

http://d.hatena.ne.jp/gintenlabo/20110108/1294485577#c で、 #include <utility> template<class F, F f> class il_ptr_fun; template<class R, class... Args, R (*pf)(Args...)> struct il_ptr_fun<R (*)(Args...), pf> { typedef R result_type; R operator()( Args... args ) const { return (*pf)( std::forward</r></class></class></utility>

C++0x で関数へのポインタによるコールバックをインライン化する

お題 http://d.hatena.ne.jp/Cryolite/01000831#p1 を C++0x によって実現してみる。 解答1 Variadic Templates を使う。 #include <utility> template<class F, F f> class il_ptr_fun; // とりあえず関数ポインタだけ template<class R, class... Args, R (*pf)(Args...)> struct il_ptr_fun<R (*)(Args...), pf> { typedef R result_type; R ope</r></class></class></utility>…