読者です 読者をやめる 読者になる 読者になる

meryngii.neta

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

Curiously Recurring Template Pattern (CRTP) と Policy-based design

C++

この記事はEEIC Advent Calender 2016の12月22日分として書かれた. CRTPとは C++でのジェネリックプログラミングで広く知られたパターンとして, Curiously Recurring Template Pattern (CRTP) というものがある. この名前は実態から大分かけ離れているの…

Uniform initialization syntaxの括弧問題についてのぼやき

C++

C++11で導入されたUniform initialization syntaxは、C++の変数宣言にまつわる諸問題 (組み込み型とクラスの違い、Most Vexing Parse、narrow conversion)を解決する機能である。 しかし、Effective Modern C++でも取り上げられているように、 波括弧 {}だ…

Non-type template parametersの威力

C++

数年ぶりにC++関連のまとまった記事を書こうという気になった。 最近の私はというと研究で毎日C++を書いていたので記事にできそうなネタはたくさんあるのだが、 それを公開するのは若干面倒なので出し渋っていたところがある。 加えて、C++嫌いな人々の根も…

エンコーディング・マジック・アワー

この記事はeeic Advent Calendar 2015の22日目の記事として書かれた. 最近動画エンコードについてよく聞かれるので,録画PCネタの続編ということで記事にすることにした. 私は動画処理に別段詳しいわけでもなく,専門分野もマルチメディアとはまるで関係な…

録画用サーバPCを組んだ時の話

1年前に深夜アニメを大量に録画しようと思い立ち、初めての自作PCとして録画用サーバを構築したのだが、いつか暇になったらその構成をWebに公開しようと思いながらもう1年も経ってしまった。(現代人には暇な時間などないのだ。) PC業界は移り変わりが激し…

CygwinのGitでエラー

何だろうこのエラーは…。 % git submodule init /usr/lib/git-core/git.exe: error while loading shared libraries: ?: cannot open shared object file: No such file or directory /usr/lib/git-core/git.exe: error while loading shared libraries: ?: …

Java向けにC++クラスをラップする方法

JNI (Java Native Interface)ネタは、この記事で一応最後です。 前々回は、Javaから渡された配列や文字列を簡単に受け取る方法について述べました。配列の受け渡しに関しては、最悪だと呼び出し毎にネイティブヒープへのコピーが発生する可能性があるので、…

JNIとC++例外

JNI関連の話が続きます。 今日は短いですが、JNIとC++例外について。 最近ではAndroid NDKもC++の例外(やRTTI)に対応していて、そのおかげで例外が必要なSTLなどのライブラリを自由に使えるようになっています。しかし、Java側はC++の例外を理解してくれな…

参照カウントとバッファ再利用

C++

std::shared_ptrの参照カウントを、バッファメモリの再利用に応用できるのではないかというお話。例として、単純なリソースクラスとそれのローダを考えてみます。 #include <vector> #include <memory> #include <numeric> class Resource { public: std::size_t size() const { retur</numeric></memory></vector>…

JNIの自動リソース解放

久々に記事を書こうと思い立ったので書きます。ブログという形態が情報共有に適切なのかどうかはさておいて、小さなひらめきであっても何らかの形で記録していかなければ自分の糧にならない、と改めて感じている今日この頃です。最近Android NDKで作業する機…

unite-outlineのLua向けinfo作った

Vim

今さらUnite.vim便利そうなので使い始めました。 unite-outlineを追加すると簡易アウトラインが見れるわけですが、Lua用が無かったので作りました。製作時間2時間半。 https://github.com/meryngii/unite-outline/blob/master/autoload/unite/sources/outlin…

amPlugのAUX端子修理

ええっ、久々の記事がソフトウェアネタじゃないのかい!?珍しく電子工作な話です。amPlugという安価で著名なヘッドホンアンプがありまして、半年前にベース用を買ったらどこでも練習できるようになって捗っていたのです。しかし、今日の練習前にAUX端子に刺…

数式のLL構文解析

以前から数式処理をやってみたいと思っていたので、その下準備として構文解析を適当に書いてみました。完成に至るまで二転三転しましたが…。 それにしてもこういうコード片だとHaskellは大活躍ですね。Haskellすごい。 import Data.Char -- 以下から引用。標…

Template Aliases

C++

C++11 Advent Calenderの26日目の記事です。 クリスマスまで残り365日と迫りましたね。C++11 Advent Forever.さて、C++11で導入された機能の一つがTemplate Aliasesです。元々はTemplate Typedefなどとも呼ばれていました。他の主要な機能と比べて大して目立…

あなたもUbuntu Linuxユーザに(オススメソフト&設定)

パソコンに慣れている人ならLinuxの話を聞いたことくらいはあるだろうが、普段はWindowsを使っている人が大半だろう。Linuxも最近ではかなりユーザに優しくなっていて、日常作業の大半をこなせるようになってきている。Linuxはサーバや組み込み用途で広く用…

Suffix Arrayの低速な生成

C++

ふと思い立ってSuffix Arrayを適当に実装することにした。 wikipedia:接尾辞配列 本当はSuffix Array専用の高速な生成方法()があるのだが、今回は適当な実装なのでソートアルゴリズムを使う()。 #include <iostream> #include <iomanip> #include <string> #include <vector> #include <algorithm> templ</algorithm></vector></string></iomanip></iostream>…

GCC 4.6.1をUbuntu 11.04でmake

C++0xの機能を試すためにGCC 4.6が欲しいのだが、UbuntuにはGCC 4.5のパッケージしか用意されていない。こういう時はソースを落としてきてコンパイルすればよい。 GCCのコンパイルには数学関連のライブラリが必要で、それらを先にコンパイルしてインストール…

再始動

久々にブログを再開します。 私がC++からしばらく遠ざかっていた間にC++0xはC++11として国際標準になりました。関係者の皆さんの努力に感謝です。 これからもC++11の備忘録を続けていきますが、興味が湧いたらソフトウェアを軸としていろんなコトに挑戦して…

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言語の奇妙な文法に合致しない。 複雑な宣…

新年に

今年もよろしくお願いします。 2009年はC++0xが発行される予定です。はたして無事C++09になれるのでしょうか。 世間のニュースは不景気のことばかりです。でも私は人々が自由に通信できる現代はとても面白い時代だと思います。現代の負の側面ばかり見てもし…

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

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

初期化順

C++

main関数に入る前の厄介なバグに出会った。調べていくうちに初期化順の問題だということが分かった。 グローバルなオブジェクトの動的初期化の順番が不定なのは私も知っている。D&Eの3.11.4.1ではcoutやcinが動的初期化に頼っていることによる問題点について…

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

例の入門書の和訳が進行中らしい

C++

http://www.stroustrup.com/Programming/ Translations in progress: * Chinese (simplified) * German * Japanese * Korean * Polish * Russian 日本語が追加されている!これは楽しみ。

丸め指定された数値演算

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

VC++用のstdint.h

C++

Visual C++ではC99で追加されたstdint.hが提供されていないが、それを補うものがあるのでメモ。 http://www.vector.co.jp/soft/win95/prog/se432866.html Boostにもある。こちらはもちろんC++限定だ。 http://www.kmonos.net/alang/boost/classes/cstdint.ht…

12/5

明日はいよいよ東京でC++WGアドホック会議がある。私は参加できないのだが、私の案も含めて会議の結果に期待したい。 あと、同じく明日参議院で国籍法の改正案が可決される見通しのようだ。2chではかなり話題になっているようで、あやしい法案なら作り直して…

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.の提案の最後に強烈なおまけがくっつい…

例の入門書の翻訳

C++

http://www.research.att.com/~bs/programming.html Translations: * Chinese translation under way. * German translation under way. * Korean translation under way. * Polish translation under way. * Russian translation under way. あれ?Japanese…