2011-01-01から1年間の記事一覧

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…

GCC Git Mirror における weekly snapshot の ID ( 20110830 〜 20110903 )

リポジトリ: http://gcc.gnu.org/git/?p=gcc.git gcc-4.4-20110830 6bf0a2fc3742f693aa4f54bc88a8dbb402c0b4c7 gcc-4.5-20110901 59a443c6714717a90e082e6e06313b9a86f301fc gcc-4.6-20110902 59739e94d23ac997277b3234ad4ba9965c53a750 gcc-4.7-20110903 b…

祝: 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…

boost::lazy_enable_if_c を更に lazy にする

C++

久々に 0x ではない C++ のコードを書いてみる.*1書いたコードは,こんな感じ. namespace pezzi { template< class T > int _validate_type(); template< class T, bool = true > struct lazy_identity_ { // nested typename `type' is not defined }; te…

GCC Git Mirror における weekly snapshot の ID ( 20110823 〜 20110827 )

リポジトリ: http://gcc.gnu.org/git/?p=gcc.git gcc-4.4-20110823 2f2814ac7a7233d3bb566029eaeee1d6ee002196 gcc-4.5-20110825 727596fdbc6dfe320e99031d721d145d6e3e37d8 gcc-4.6-20110826 b43c078c7fd66b3d76bbf678c8a9088f17ceccaa gcc-4.7-20110827 9…

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…

GCC Git Mirror における weekly snapshot の ID ( 20110816 〜 20110820 )

リポジトリ: http://gcc.gnu.org/git/?p=gcc.git gcc-4.4-20110816 1b78de81183c9413799138b029cd90fe801cafe7 gcc-4.5-20110818 e521e592c4fa9d975d2687c0a2db9a187796d58c gcc-4.6-20110819 c20e2d427ec57a584e33cdd4ef4720b71ee8eb16 gcc-4.7-20110820 8…

GCC Git Mirror における weekly snapshot の ID ( 20110809 〜 20110813 )

リポジトリ: http://gcc.gnu.org/git/?p=gcc.git gcc-4.4-20110809 e75a7828c3a9ffad0a06390dbd0b90c6e6087000 gcc-4.5-20110811 4663a3b98723e9946c476992eeb8e1c5a85108f3 gcc-4.6-20110812 b9938337484efd69754850b17f841f6eae4f39c2 gcc-4.7-20110813 4…

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…

GCC Git Mirror における weekly snapshot の ID ( 20110802 〜 20110806 )

リポジトリ: http://gcc.gnu.org/git/?p=gcc.git gcc-4.4-20110802 b9240a8b3d6e05f36549aa6bcd84088402297204 gcc-4.5-20110804 4e2e42e13849ad7dab8a412022a3aef3d85799ac gcc-4.6-20110805 1161f57ffe628887c47b525bd19a6c2e8faabe20 gcc-4.7-20110806 9…

GCC Git Mirror における weekly snapshot の ID ( 20110726 〜 20110730 )

リポジトリ: http://gcc.gnu.org/git/?p=gcc.git gcc-4.4-20110726 5fc366e94a5711c44433e5a6e52bf41696f706c0 gcc-4.5-20110728 616ae7f6a504a650129ead7c3b7178f2fb342b73 gcc-4.6-20110729 2ba3c96e89b49f66eb6ff16428dc31e1d9eb7632 gcc-4.7-20110730 a…

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

GCC Git ミラーの Release に tag を打つ

GCC 公式の Git ミラー http://gcc.gnu.org/git/?p=gcc.git は, Release に対して tag が打たれていません. で,それは不便なので, Release に対して tag を打つ方法を紹介します. やり方は簡単で,適当な branch ( origin/gcc-4_6-branch 等)に対し,…

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+= を使うからだよ __.. -―─ 、__ /` 三ミー ヘ、_ ゝ' ;; ,, , ,, ミミ , …

Boost の Release 版のみを Git リポジトリから持ってくる

Boost のバージョンが上がる度に,毎回 手動でファイルをダウンロードするのは,少し面倒ですよね. そういう場合には, Git リポジトリを使うのが便利ですが,単に git clone git://github.com/ryppl/boost-svn.gitとした場合,開発版も全部一緒にダウンロ…

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 に存在していた多くのバグが修正され…

Git ログの圧縮法

Git

何かのプロジェクトをバージョン管理をしていると,しばしば, こまめにコミットしたい その方が修正とかも効きやすいし,変更も追いやすい ログも細かくなる分だけ分かりやすくなる でもログが細かすぎるのは嫌だ 後でざっと見返すときは大雑把な方がいい …

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