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

[C++]等高線表示機能の追加。Gnuplotライブラリ更新(1)。

GitHubで公開しているC++用GnuplotライブラリADAPT-GPM2に等高線表示機能を追加した。Gnuplotが持つ仕様上の問題を吸収するために、ちょっと回りくどい実装になってしまった。 ライブラリについては過去記事を参照。 github.com Gnuplotのpm3dにおける最大の…

[C++]std::common_typeの挙動は直感的ではない。

C++

以前、range-based for loopに非配列変数の一覧を与えるためのHoldRefArray関数を実装していた時、std::common_typeを使うことはできないかと考えたことがある。のだが、これがどうも“共通して変換可能な型”という説明から連想される結果と今ひとつ合致しな…

Visual C++のエラーC1033、C2471の原因。

Visual C++でプロジェクトをビルドしている時、稀に C2471: プログラム データベース 'file' を更新できません。 C1033: プログラム データベース 'file' を開けません。 というようなエラーが出る場合がある。 多くの場合、これはソースコードの誤りなどで…

[C++]多重ループを一つに纏める直積集合イテレータを作ってみた。

C++

Range-based for loopを理解してからというもの、その悪用を色々と思いついてしまって。 今日も小ネタである。実用性はあんまりない。多重ループにすれば良いところを、敢えてそれを統合し一つのループで表現したくなってしまった病的C++erのお遊びだ。唯一…

[C++]ムーブセマンティクスに対応するThreadPool。

プログラミング界隈でよく知られたマルチスレッド処理のためのパターンであるスレッドプール。使用可能なスレッド数を予め定めておき、そこにキュー方式で処理を追加していくもの。走らせたい関数が100個くらいあったとしても、それを順番待ちに追加して逐次…

[C++]テンプレート再帰回数の限界、再帰回数を減らす実装方法。

C++

テンプレートメタプログラミングなどをしていると多用することになる、テンプレートの再帰。実はこの再帰回数には制限がある。C++11ではこの再帰回数は1024回が推奨されており十分に大きい。実際の回数制限はコンパイラによって異なるが、それなりに大きな数…

Visual Studioで64bitコンパイラツールセットを使う方法。C1060への対処。

msvcでテンプレートを大量に使うなど非常に重たいコードをコンパイルしていると、 fatal error C1060: ヒープの領域を使い果たしました。 というエラーが出ることがある。 Visual Studioのデフォルトのコンパイラは未だに32bitである。出力するバイナリが32b…

[C++]std::bindはnon-copyableな引数を束縛できない。

C++

タイトルのとおりである。std::bindはnon-copyableな引数を束縛できないので、rvalue referenceを引数に取るような関数の扱いには注意を要する。 std::bindは、何らかの関数に事前に引数を与えた関数オブジェクトを生成する機能である。事前に引数を与えてお…

DISLIN解説②

解説①に引き続き、本稿ではまだるっこしいことはどうでもいいからグラフを描いてみよう、という趣旨の解説を行う。ちなみに③の予定はない。私がDISLINに愛想を尽かし、使うことを諦めてしまったからだ。 というわけで、ありがちなsin、cos関数をプロットして…

DISLIN解説①

最近、C++でのグラフ描画のためにDISLIN(マックス・プランク研究所開発)を試していた私だが、C++からグラフを描くには多くの場合Gnuplotが選択されるようで、そうでない場合もROOT(CERN開発の統計解析ライブラリ)やせいぜいPLplot(多言語対応のグラフ描…

[C++]std::functionに与える関数はcopy-constructibleでなければならない。

C++

std::functionは関数ポインタも関数オブジェクトもメンバ関数ポインタもまとめて管理することのできるとても便利な機能である。std::functionは"引数"と"戻り値"の型のみ指定されていればよく、それ以上は何も要求しないので、引数と戻り値の等しい関数オブ…

[C++]テンプレートテンプレートパラメータの“テンプレート引数の数”を取得することはできるのだろうか。

C++

例えば次のようなクラステンプレートX、Yがあったとする。 template <class> struct X {}; template <class, class> struct Y {}; Xはテンプレート引数が1個、Yはテンプレート引数が2個である。 このX、Yを次のようなクラステンプレートに与えてみる。このXorYは、与えられたXやY</class,></class>…

pybind11の引数の型に注意。

自作ライブラリのPythonラッパーを作るためにpybind11を導入している私だが、関数引数の型についていくつかのエラーに悩まされたので、備忘録として記しておく。 デフォルト引数の型が適切かどうかはコンパイル時に判定されない。 void func(const std::vect…

[C++]配列でない個別の値を一纏めにしてrange-based for loopで走査、編集したいとき。

C++

先日は複数のコンテナをrange-based for loopで同時に走査する方法を書いたが、今回は配列になっていない同じ型の変数についてループする話。例えばint型の変数i1~i5がある時、i1~i5までをループしたくなったらどうするのか。 よくある方法としては、波括…

[C++]ラムダ式をオーバーロードする。

C++

C++17未満で使える自作Variantを実装する最中、visit関数の動作を調べている中で偶然見つけ、衝撃を受けた。C++のラムダ式は擬似的にオーバーロードすることができる。 #include <iostream> #include <string> template <class ...Ts> struct OverloadedLambda; template <class T, class ...Ts> struct Overloaded</class></class></string></iostream>…

[C++]継承関係を跨ぐメンバ関数テンプレートのSFINAEには注意すべし。

C++

基底クラスと派生クラスとの間で、同じ関数名、同じ引数、同じ戻り値のメンバ関数をそれぞれ定義し、SFINAEによってそれらを呼び分けることが出来ないかと考えたことがある。 例えば次のようなコードがあったとする。 struct Base { template <class T, std::enable_if_t<std::is_integral<T>::value, std::</class>…

[C++]range-based for loopはindexを持てるし、複数のコンテナの同時走査だってできる。ちょっとだけ頑張れば。

C++

※本記事の内容をC++20の<ranges>に対応するように更新した記事があります。C++20を使用中の方はそちらを参照してください。->std::ranges::views::zip、enumerateの代替機能を作ってみる。 私はrange-based for loopを十分に扱えていなかったのだと思い知った今日こ</ranges>…

[C++]コンパイル時と実行時の橋渡し。

C++

モダンC++では、できるだけコンパイル時に処理をして実行時のコストを軽減する設計が望ましいとされる。それは高速化やポリモーフィズムという観点では確かに正しいのだが、往々にして面倒な状況を生む。例えばstd::tuple<...> tに格納した各値について、実…

C++用のGnuplotラッパーライブラリを一般公開することにした。

タイトルのとおりである。ADAPT-GPM2という名前のライブラリだ。 github.com C++によるグラフ描画のためのライブラリは意外と見つかる。CERN開発の統計解析ライブラリであるROOT、マックス・プランク研究所開発のDISLIN、その他PGPLOTやPLplot、比較的小規模…

ブログ開設。

研究関係のブログを始めることにした。 私は某大学で日々研究に勤しんでいるかもしれない貧乏人である。かれこれ十年近く、日常的な話題を取り扱う個人的なブログを続けてきたのだが、あちらは曲がりなりにも匿名で行っている以上研究内容に言及するような話…