meryngii.neta

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

C++0x

空メンバの最適化を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になるよりはいいか…。 …

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 右辺値参照、可変個引数テンプレ…

mailing2009-02

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

書式もコンパイル時に解析するprintfもどき

この記事の内容は古くなっており、正式なC++11では動作しません。詳細は中3女子さんからのコメントをば。 C言語の普通のprintfについて知りたい人は、他を当たった方がいい。 C++0xのVariadic Templatesのおかげでprintfもどきを作るのが簡単になった。書式…

C++0x FAQ

Stroustrup氏のサイトにC++0x FAQというものが掲載されていることに気づいた。 http://www.research.att.com/~bs/C++0xFAQ.html Suffix return type syntaxではdecltypeで戻り値を指定する場合の例にautoの案を紹介しているが、 template<class T, class U> auto mul(T x, U y)</class>…

get_money

ボーっとN2800を眺めていたら、moneyという単語が目に飛び込んできた。しかもget_moneyとは生々しい…。 27.6.4 Extended Manipulatorsでは通貨や時刻を入出力するためのマニピュレータについて定めている。ロケール絡みで通貨の文字列を処理するmoney_getと…

丸め指定された数値演算

mailing2008-12が来ました。 Directed Rounding Arithmetic Operationsという提案があるようです。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2811.pdf この提案の動機はC++0xで区間演算*1がサポートされることになったことです。C99からfe…

constexprの再帰を認めるべき

C++0xではconstexprによってコンパイル時に扱える問題の範囲が広がります。例えば、コンパイル時に評価できるユーザ定義型(複素数型など)をROM領域に置くことができるようになります。 現状の仕様でconstexprで定義された関数は再帰ができません。コンパイ…

属性の使い道

C++0xの属性の使い道で思いついたものを適当に並べる。 pod nonpod PODの定義が複雑なので、ユーザが思っている方でなかったらエラーを出すとか。 クラスを作るときも指定するときも。 static_assert(is_pod::value);でもいいか。 restrict C++ではnoalias・…

fstreamのファイル名

std::fstreamがファイル名をマルチバイト文字列(const char*とconst std::string&)でしか受け取れない件についてです。 template <class charT, class traits=char_traits<charT> > class basic_fstream : public basic_iostream<charT,traits> { public: // ... explicit basic_fstream(const char* s, ios_base::open</chart,traits></class>…

template concept

Committee Draftへのコメント一覧 - Faith and Brave - C++で遊ぼう 私の意見(41.)もまとめて下さったようで感謝。 fstreamのファイル名がconst wchar_t*を取れないのも加えて欲しいです。 さて、読み進めていくと、14.の提案の最後に強烈なおまけがくっつい…

属性(attribute)

N2798には属性(attribute)に関する記述が追加されています。誰も解説していないようなので簡単な紹介を書きます。 属性は型、変数、名前、ブロック、翻訳単位に情報を付加するもので、 [[attribute]] のように、ブラケット二つで囲まれた中に記述します。 C#…

ストリームとコンセプト

ストリームとコンセプトを組み合わせてみた。 #include <iostream> #include <concepts> auto concept HasShowing<typename T> { requires std::HasLeftShift<std::ostream&, T>; } template <HasShowing T> void show(T x) { std::cout << x; } int main() { show('A'); show("abc"); //show(123); // ambiguous //show(3.14)</hasshowing></std::ostream&,></typename></concepts></iostream>…

10月分

最新のドラフトが出たようです。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/#mailing2008-10 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2798.pdf コンセプトが追加されたようです。これから読み始めます。

=nullptr;

nullptrが導入されれば純粋仮想関数がこんな風に書けるのかと思っていたのだけれども、 virtual void func() = nullptr; 現在のドラフトにはこんな記述はなかった。実際にvtblにヌルポインタを置くわけじゃないのは分かるけど、=0;ってやっぱ気持ち悪いなあ……

std::Trueの実験

concept std::Trueの実験にと思ってコードを書いてみたのだけれども、ConceptGCCが14行目でinternal compiler errorを吐く。 #include <iostream> #include <concepts> template <class T> requires std::True<(sizeof(T) < 4)> void f(T x) { std::cout << "a"; } template <class T> requires std</class></class></concepts></iostream>…

せっかくだからconst char*をRangeに

この前書いた記事はconcept_map Rangeがあるのかと思ったらconst char[]なだけだったというわけだが、 http://d.hatena.ne.jp/meryngii/20080927/1222494258 せっかくなので書いてみた。 #include <iostream> #include <cstring> #include <concepts> namespace std { concept_map Range<const char*> {</const></concepts></cstring></iostream>…

conceptでの...

Callableは関数オブジェクト用のコンセプトで、N2741だと汎用的にVariadic Templatesを利用して定義されている。 auto concept Callable<typename F, typename... Args> { typename result_type; result_type operator()(F&&, Args...); } operator()のところだけれども、これが「一定の数</typename>…

.NETのConsoleもどき

Variadic Templatesの練習のためにSystem.Consoleもどきを。 #include <iostream> #include <complex> struct Console { template <typename T, typename... Types> static void Write(T&& arg, Types... args) { std::cout << arg; Write(args...); } template <typename... Types> static void WriteLine(Types... args) { Write(</typename...></typename></complex></iostream>…

C文字列に拡張for文

C文字列に拡張for文を使ったら、普通に通った。 #include <iostream> int main() { for (char c : "test") std::cout << c << std::endl; } C++ユーザにとっては新鮮なコード。んでこれが通るということは、const char*についてのconcept_map Rangeがどこかにあるはず</iostream>…

Visual StudioでC++0xのキーワードを色分け

Visual Studioにはユーザーキーワードという微妙に便利な機能があるらしいです。 http://wikiwiki.jp/redstrange/?Microsoft%20Visual%20Studio%20%A5%E6%A1%BC%A5%B6%A1%BC%A5%AD%A1%BC%A5%EF%A1%BC%A5%C9 これはC++0xのキーワードを色分けするしかない! …

rel_ops

C++では==と!=のように片方だけあれば十分なものもすべて定義しなければならない。これを自動的に生成してくれるのがBoost.Operatorsなわけだが、標準ライブラリにもstd::rel_opsに比較演算のみ自動的に生成するものがあるようだ。 namespace rel_ops { temp…

conceptでのエラー

andLinux上でのConceptGCCのmakeに挫折したので、結局Cygwin上で試すことになった。 ものすごくコンパイルが長いけど、テスト版だからしょうがない。 #include <algorithm> int main() { std::sort(1, 2, 3); // ここでエラー } conceptg++ -o test test.cppなかなか簡</algorithm>…

ConceptGCCのビルドがうまくいかない

andLinuxでConceptGCCをコンパイルしてみたが、どうもうまくいかなかった。再度挑戦するときのために経過をメモしておく。 まず、おなじみのツールをインストールする。 apt-get install gcc apt-get install autoconf apt-get install makeGMPとMPFRが必要…

char16_tとchar32_t

Unicodeサポートのためのchar16_tとchar32_tは、C++0xで予約語になるようだ。 C99に合わせるために取り入れられるint32_tなんかは、名前が似ているがstd名前空間に入っている。 おそらく新しいプリミティブ型だからだろうと思う。

[]

統一された関数宣言構文というものがある。 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2582.html template <class T, class U> [] mul(T x, U y) -> decltype(x * y) { return x * y; } うーむ、気持ち悪い。 class A { template <class T> [] operator[](T x) -> decl</class></class>…