C++0x

GCC-4.7 に Alias declarations (Template aliases) が実装されていた

いつの間にか GCC-4.7 に Alias declarations (Template aliases) が実装されていたようです: http://gcc.gnu.org/projects/cxx0x.html これにより, // my_vector<T> を std::vector<T, my_allocator<T>> の代わりに使える // 関数テンプレート等で型推論させられない弱点はある</t,></t>…

Twitter で竹内関数が話題に登っていたので Haskell で関数適用回数を数えてみた

内容はタイトル通り. 折角なので正格評価と遅延評価の両方でカウント. import Data.IORef import System.IO.Unsafe -- グローバル変数 -- 本題ではないので詳細は省略 resetCount :: IO () incCount :: IO () readCount :: IO Int ( resetCount, incCount,…

名前空間内で定義された user-defined literals を使う

今まで user-defined literals では名前空間を使えないと思い込んでいましたが, 規格を読むと,名前検索は普通の関数と同様に行われるようなので,普通に 名前空間内で定義し,その名前空間内で特に何も考えずに使用することも可能だし, 違う名前空間であ…

const は消えていない

const が消える件… - 危ないRiSKのブログ 結論を書くと,別に const は消えていない. 単に T が int const& に推論されているだけだ. // 型名のデマングル用 utility // thanks to http://cpplover.blogspot.com/2010/03/gcc.html #include <cxxabi.h> #include <cstdlib> // </cstdlib></cxxabi.h>…

post-Bloomington mailing が公開された

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/#mailing2011-09 今回もドラフトの更新は無し.*1 constexpr 絡みの提案など,幾つかの paper が公開されている. また, WG のトップページ で,新しい国際標準 C++11 が発行されたことが正式にア…

constexpr な std::next を考えてみた

#include <utility> #include <type_traits> #include <iterator> namespace pezzi { // constexpr な forward template< class T > constexpr T&& forward( typename std::remove_reference<T>::type& x ) noexcept { return static_cast<T&&>(x); } // rvalue は forward 不可にする // int x; std:</t&&></t></iterator></type_traits></utility>…

C++0x の不動点コンビネータを std::ref で高速化する

元ネタ: iorateの日記「 C++0x で不動点コンビネータ」 http://d.hatena.ne.jp/iorate/20110729/1311949434 上の記事の不動点コンビネータは,再帰の度に毎回 std::function を生成しているため,かなり遅いですが, std::function は, std::reference_wra…

祝: ISO/IEC 14882:2011 発行!

C++0x 改め C++11 の規格文書が, ISO から購入できるようになりました. http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=50372 今のところ,値段が 352 スイスフランと高いので,僕は より安い版が http://webstore.ans…

C++0x の SFINAE で気づいたこと

関連: http://d.hatena.ne.jp/gintenlabo/20110413/1302675301 C++0x の関数テンプレートがデフォルトテンプレート引数を取れるようになったことで可能になった, extern void* enabler; template < typename T, typename std::enable_if< std::is_arithmet…

Haskell の undefined や error が羨ましかったので, C++0x で作ってみた

http://ideone.com/nh39a #include <stdexcept> #include <utility> namespace proto_etude // prototype etude { // あらゆる型として評価できるが,実際に評価されると例外を投げる型 struct undefined_t { // 任意の型への変換 template< class T > operator T&&() const { th</utility></stdexcept>…

pre-Bloomington Mailing が公開された

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/#mailing2011-07今回は FDIS 直後ということもあり,ドラフトは更新されませんでしたが,大事なことが一点. C++ の新しい国際標準規格案,通称 C++0x が,投票により承認されたようです:http://z…

Boost.Bind の protect 相当の関数を C++0x の に用意する

元ネタ: http://d.hatena.ne.jp/Flast/20110728/1311878870 (std|boost)::bind の結果を (std|boost)::bind に渡すと,特別扱いして関数合成を行ってくれるんだけど,それ邪魔な時があるよね. boost::bind には protect があるけど, std::bind で同様のこ…

配列の 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 で束縛できるようにしてみました. なお,テスト等は全く行っていないので,使う場合は自己責任でお願いし…

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 operator が gcc-4.6.0 で正しく SFINAE されない件

gcc-4.6.0 では、以下のコードが正しくコンパイルされてしまう。 template<class T> T&& declval() noexcept; template< class T > inline void f1( T& x ) noexcept( noexcept( declval<T&>().foo() ) ) { x.foo(); } template< class T, bool Noexcept = noexcept( decl</t&></class>…

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/…

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 // …

range-based for

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