meryngii.neta

今日も新たな"ネタ"を求めて。

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

boost::tieのネスト

アキラさんの記事を読んでboost::tieのことを思い出し、もしかしてこいつはネストできるのかと気になったので調べてみた。 #include <boost/tuple/tuple.hpp> int main() { using namespace boost; int i; double d; const char* s; tie(tie(i, d), s) = make_tuple(make_tuple(123,</boost/tuple/tuple.hpp>…

空メンバの最適化をVariadic Templatesで

The "Empty Member" C++ Optimization これにVariadic Templatesを使ってみようと思いついた。 template <typename Member, typename... Bases> struct BaseOpt : Bases... { Member m; template <typename... Arg> BaseOpt(Arg&&... arg) : m(std::forward<Arg>(arg)...) { } }; class X { static void foo() { } }; cl</arg></typename...></typename>…

std::result_ofの実装

std::result_ofを即席で作ってみました。 template <class> class result_of; // undefined template <class Fn, class... ArgTypes> class result_of<Fn(ArgTypes...)> { public: typedef decltype((*(Fn*)0)((*(ArgTypes*)(0))...)) type; }; テストコードはこんな感じ。 #include <iostream> #include <typeinfo> template <int> struct A</int></typeinfo></iostream></fn(argtypes...)></class></class>…

Committee Draft 1への日本からのコメントのその後

C++0xのCommittee Draft 1への日本からのコメントのその後について適当に書いてみました。 C++ CD1 Comment Status まあ原文を読んでもらえば済む話なのですが、半年経った今改めて振り返るためにまとめました。 結構数があるので今回はtypoの修正等を省略さ…

型消去と引数転送

右辺値参照 + 可変個引数テンプレートでBoost.Functionの真似事をしようと思ったのだが、なんだか面倒な問題にぶち当たってしまったらしい。 #include <utility> template <typename... Args> struct my_function { template <typename T> struct object_invoker { static void invoke(void* ptr, Ar</typename></typename...></utility>…

conceptが…

少し遅れたけれども、 C++0x 6 (2ch) The Digitalmars-d-announce July 2009 Archive by thread Conceptのお通夜会場はこちらです - にっき(pseudo) C++0x Support in GCC Concepts [no longer part of C++0x] なんという…。 C++1xになるよりはいいか…。 …

VMware上のUbuntuとフォルダ共有

これまでGCCを使うためにCygwin・MinGW・andLinuxなど様々と試したのだが、GCCをmakeするたびに必ずエラーが起きて、さすがにもう懲り懲りになった。かといって普段の作業はWindowsでやっているから、このためだけにLinuxに乗り換えるのも難しい。そんなとき…

GCC 4.4.0がリリース

http://gcc.gnu.org/gcc-4.4/ GCC 4.4.0がリリースされました。C++0xの機能の一部を取り込んでいます。これらを試すにはコンパイラに-std=c++0xというオプションを渡します。 http://gcc.gnu.org/gcc-4.4/cxx0x_status.html 右辺値参照、可変個引数テンプレ…

volatileなオブジェクトのコピー(再び)

C++

以前volatileとコピー・代入 - meryngii.netaということでvolatileにまつわるCとC++の非互換性について書いたのだが、C++の仕様書の最後で丸々このことが触れられていることに気づいた。せっかくなので拙訳を用意した。 付録C.1.8 12項. 特別なメンバ関数 12…

operatorでストリームの書式状態を保存する

C++

C++のストリームの書式状態は、一度変更すると再び変更しない限りそのままになる。書式フラグを元に戻すのを忘れていれば、同じストリームを使った別の部分のコードで思わぬ表示が出るかもしれない。 書式状態を保存するためのライブラリとしてboost::ios_st…

このブログのフォント

普段はFirefoxしか使っていないので気づかなかったのだが、IE7だとこのブログはかなりひどいフォントで表示されていたらしい。 VistaのIE7でsans-serifがGulimになる - きよくらの備忘録 sans-serifだけを指定していると起きるバグ(?)らしい。ブログ用スタイ…

配列引数の要素数を調べる

C++

配列を返す関数 - meryngii.neta 以前に配列を返す関数は参照を使えば作れることを紹介したのだが、同じように関数の配列引数の要素数も調べることができるらしい。 #include <iostream> void f(int a[]) { std::cout << (sizeof(a) / sizeof(int)); } int main() { in</iostream>…

ストリーム関連の命名はあまりにひどい

C++

C++の教科書で必ず最初に現れるcoutとかC++の入出力ライブラリはオーバーロードを駆使することで型安全を堅持している。これはStroustrup氏の自信作で、その内部はテンプレートによって汎用性の高い設計になっている。 しかし、ストリームに関するクラス・関…

volatileとコピー・代入

C++

C++でvolatile修飾された構造体はものすごく扱いにくい。 typedef struct { int x; } X; int main() { X n_1; volatile X v_1; /* コピー(代入ではない)*/ X n_2 = n_1; /* OK */ X n_3 = v_1; /* エラー */ volatile X v_2 = n_1; /* OK */ volatile X v_…

テンプレート名と継承元

C++

C++ではテンプレート名が型名になるという仕様があるのだが、 クラステンプレート名は型名 - meryngii.neta これはなぜか継承元の指定では使えないらしい。 template <class T> struct A { }; template <class T> struct B //: A<B> // 1, NG : A< B<T> > // 2, OK { typedef A< B<T> > </t></t></b></class></class>…

エスケープと一行コメント

C++

// 使用可能 int x; 場合によってxは使用できないかもしれない。 Shift-JISにおいて「能」は2バイト目が\(0x5C)なので「だめ文字」と呼ばれる。これらの文字は配慮の足りないプログラムからエスケープと見なされて文字化けなどの問題を起こす。 また一行コ…

mailing2009-02

最近忙しくて記事を書けませんでした。 どうやらmailing2009-02が出たみたいです。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/#mailing2009-02 N2814 Fixing freestandingにフリースタンディング環境についていろいろ書いてあります。C++0x…

配列を返す関数

C++

C言語では配列を返す関数を作ることができない。 int a[100]; int f()[100] // エラー:関数は配列を返せない { return a; } 本当は int[100] f() // エラー:構文エラー { return a; } と書きたいところだが、これはC言語の奇妙な文法に合致しない。 複雑な宣…