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

C++と色々

主にC++やプログラムに関する記事を投稿します。

std::variant

C++

C++17にはstd::variantというライブラリが追加されます。 variantは組み込みのunionよりリッチなインターフェイスを持った型安全なunionです。*1 Visual Studio 2017にも入りましたので簡単なサンプルを書いてみました #include <variant> #include <iostream> #include <string> struct</string></iostream></variant>…

std::error_code, std::error_category, std::error_conditionの違い

C++

概要 C++11で <system_error> ヘッダが追加され、その中に3つのクラス std::error_code std::error_category std::error_condition が追加されました。自分はこの3つクラスの違いがわからなかったので調べてまとめてみました。ソースは https://www.amazon.co.jp/dp/479737</system_error>…

C++ Testing Framework banditの紹介

C++

github.com 概要 banditはC++11以降を前提としたC++のユニットテストのフレームワークです。 Human Friendlyらしいです。MITライセンスです。 導入 Releases · joakimkarlsson/bandit · GitHub からzipかtar.gzでダウンロードするか git cloneして使うと良い…

Asioで非同期Http通信

C++

Boost.Asioから切り離したAsioライブラリがあります。 asio C++ library 名前空間が違うぐらいでほとんどBoost.Asioと同じように使えます。Boost.AsioがBoost.SystemErrorやBoost.DateTimeに依存しているのに対し、独立して動くという点が嬉しいです。 試し…

コンパイル時ズンドコキヨシ

C++

ズンドコキヨシ with C++14 - C++と色々 の続きです。コンパイル時にズンドコキヨシをやってみました。 static_assert で、ちゃんとシーケンスの最後の5つがズンズンズンズンドコになっているかを検証しています。Sprout.RandomとBoost.MPLを使用しています…

ズンドコキヨシ with C++14

C++

これ qiita.com なぜかC++版が無かったので。コードゴルフとかやらずに、ファンクタとイテレータで実装してみた。C++11では古くて動きません #include <algorithm> #include <array> #include <iostream> #include <iterator> #include <random> #include <string> #include <utility> struct zundoko_generator { static con</utility></string></random></iterator></iostream></array></algorithm>…

型とオブジェクトと値と変数

C++

C++のエッセンスを読んでいて、C++における型とオブジェクトと値と変数の定義が興味深かったので引用メモします。 SBクリエイティブ:C++のエッセンス のP5 §1.5型と変数と算術演算 より すなわち、宣言は、以下に示すような、名前付きの実体に対する、型の指…

「Boost.勉強会 #19 東京」に参加しました

2015/12/05に行われたBoost.勉強会 #19 東京に参加してきました。 connpass.com 朝10時からと、起きられるか大変不安でしたが、無事起きられて安堵しました。 会場としてなったIIJさんからお水を頂きました。ありがとうございます。 最初に@cpp_akiraさんか…

Visual C++ 2015 Update 1でC++にmoduleが試験的に実装された

要約 12月1日のUpdate1でVisual C++にmoduleが試験的に実装されました channel9.msdn.com このmoduleの文法はおおよそ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4214.pdf と近いものになっています。 moduleとは javaのpackage/importや、…

for_each_argument 前半

C++

こちらの動画 www.youtube.com で紹介されているイディオムを自分なりに解釈を加えてまとめてみようと思います。長いので前半後半に分割する予定です。 for_each_argument C++14から入った、ジェネリックラムダを用いて、色々な型の変数を走査するfor_eachを…

Aggregates 集成体

C++

以下staticデータメンバと明示しない限り、非staticデータメンバを単にデータメンバと表現します。 Aggregates とは Aggregates(以下、集成体)は配列と、以下の条件を満たしたクラスです。 ユーザ定義のコンストラクタ(コピー、ムーブ含む)が無いこと。つま…

インデックスアクセス可能なシーケンスの各要素にindex_sequenceを用いて戻り値voidな関数を適用する

C++

素敵なタイトルが思いつきませんでした。 結論 以下のリンクに書いてある内容について触れています c++ - Pretty-print std::tuple - Stack Overflow c++ - Iterating on a tuple... again - Stack Overflow c++ - What does this variadic template code do…

初期化キャプチャでは可変長引数テンプレートはキャプチャできない

C++

初期化キャプチャ(init-capture)で、可変長引数テンプレート(variadic templates)をキャプチャしようと思って調べてのですが、できないようです。キャプチャデフォルト(capture-default)と単純キャプチャ(simple-capture)でキャプチャすることは出来ます。 …

boost::fusion::vectorで異なる型のコンテナ

動的な多態性を持った型のオブジェクトをコンテナで扱いたい場合、基本クラスの参照型または基本クラスのポインタ型のコンテナを使うことができます: #include <iostream> #include <memory> #include <vector> struct A { void disp() const { do_disp(); } private: virtual void do_</vector></memory></iostream>…

部分適用された関数

C++

ScalaにかこつけたC++の紹介 Scalaには部分適用された関数というものがあります。Scalaでは必要な引数を渡して関数を呼び出すことを、関数を引数に適用する(apply)と表現します。例えば: def sum(a: Int, b: Int, c: Int) = a + b + c という関数があったと…

C++にこんな変数宣言があればいいのに

C++

前置き 最近Scalaを勉強しています。Scala勉強している時に、変数宣言周りでC++でもこう書けたらいいなと思うことが2つあったので晒してみます。 変数宣言・定義時の型の後置 関数の戻り値の型が後置できるのだから、変数の型も後置で来てもいいじゃないか、…

VC++2015PRでURIエンコード

Visual C++ 2015でC++1zで提案されているTerse range-based for loopsと、C++11のUnicodeリテラルが入ったので使ってみました。 #include <algorithm> #include <iomanip> #include <sstream> #include <string> namespace { std::string const unreserved_chars = "abcdefghijklmnopqrstuvwxyzABC</string></sstream></iomanip></algorithm>…

最低限の機能のアーカイバ書いてみた

C++

コード書くのに疲れたのでコードの説明は割愛。正直コメントや説明ないと読むの辛いと思います… やってること自体はセガ本(ゲームプログラマになる前に覚えておきたい技術)の最もシンプルなアーカイバと同じです。 ディレクトリの再帰構造に対応していません…

C++でProducer-Consumerパターン書いてみた

↓この本の第5章 Producer-ConsumerパターンをC++で書いてみた。 増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編作者: 結城浩出版社/メーカー: ソフトバンククリエイティブ発売日: 2006/03/21メディア: 大型本購入: 15人 クリック: 287回こ…

ドワンゴC++勉強会 #1に参加してきました

C++

書くのがかなり遅くなってしまいました… 6/28にドワンゴでC++の勉強会があり、参加してきました。 メタプログラミングに関する発表が多く、だいぶニッチな内容だったと思います。 constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。CPUの…

C++ Testing Framework Catchの紹介

C++

CatchとはC++のテスティングレームワークの1つです。ヘッダオンリーで使うことが出来ます!簡単! https://github.com/philsquared/Catch 私はこちらのブログを拝見して知りました。 ブログズミ: C++ Testing Framework の Catch を使ってみた Google Testな…

選択ソート書いてみた

普通のと、デバッグ用ストリーム出力ありのやつ #include <algorithm> #include <iterator> #include <functional> #include <utility> template <typename Iterator> void selection_sort(Iterator first, Iterator last) { selection_sort(first, last, std::less<>{}); } template <typename Iterator, typename Compare> void selection_sort(…</typename></typename></utility></functional></iterator></algorithm>

バブルソート書いてみた

普通のと、デバッグ表示用の2種類 #include <algorithm> #include <iterator> #include <functional> #include <utility> template <typename Iterator> void bubble_sort(Iterator first, Iterator last) { bubble_sort(first, last, std::less<>{}); } template <typename Iterator, typename Compare> void bubble_sort(Iterator first,…</typename></typename></utility></functional></iterator></algorithm>

テンプレートテンプレートパラメータにtypenameキーワードを使えるようにする

C++

N4051 Allow typename in a template template parameter 今のC++ではテンプレートテンプレートパラメータにはclassキーワードしか使えません。 template <template <typename> class T> // OK struct A; template <template <typename> typename T> // NG struct B; この制限を無くして、typenameキ</template></template>…

C++の関数のオーバーロード解決について

C++

問題です。以下のコードで、(a)、(b)、(c)、どの関数が呼ばれるでしょうか。 #include <iostream> using std::cout; // (a) template <typename T> void f(T) { cout << "f(T)"; } // (b) template <> void f(int*) { cout << "f(int*)"; } // (c) template <typename T> void f(T*) { cout << </typename></typename></iostream>…

ジェネリックラムダ

C++

C++14で実装されるジェネリックラムダの引数の型autoは、テンプレート引数と同じ型推論が行われます。なので引数の右辺値参照が左辺値参照にもなります。 #include <iostream> #include <type_traits> #include <utility> int main() { auto lam = [](auto&& val) { using type = decltype(va</utility></type_traits></iostream>…

using宣言とusingディレクティブ

C++

using宣言は既に宣言済みの名前だけを現在のスコープに取り込みます。 #include <iostream> namespace A { void f(double) { std::cout << "f(double)" << std::endl; } } using A::f; namespace A { void f(int) { std::cout << "f(int)" << std::endl; } } int main(</iostream>…

ラムダ式で再帰関数

C++

先日の記事にて、C++にラムダ式の再帰関数が欲しいと書いたのですが、調べたらstackoverflowにラムダ式での再帰関数を実現しようとしているコードがありました。 #include <functional> #include <iostream> int main() { std::function<int (int)> fact; fact = [&fact](int n){ return n == </int></iostream></functional>…

C++に欲しい機能

C++

C#書いていて、これC++にも欲しいなぁ、と思ったり、普通にこういう機能欲しいと思ったものです。 ネストした名前空間 今のC++ではこう書かないといけません。 namespace hoge { namespace foo { ... } } をこう書けたら良いなぁ、と思いました。 namespace …

マルチメソッド4 対数時間編

C++

マルチメソッド3 力まかせ改良編の続きです。 basic_dispatcher flat_mapを使う RTTI(実行時型情報)と、type_index(typeinfoを比較できるようにラップした型)の2つがあることにより、全ての型に対して(もちろん動的な型も含みます)、順序関係を持つことが出…

find関数で見るC++の変化

C++

STLアルゴリズムはそのアルゴリズムを適用する範囲の先頭と末尾のイテレータのペアを引数に取ります。実際には範囲全体にアルゴリズムを適用させるケースが多く、イテレータのペアを書くのが冗長に感じることがあります。そこでBoost.Rangeには、範囲を引数…

歌舞伎座.tech#2に参加してきた

C++

補欠参加だったので、前日までに枠に入れてラッキーでした。 普段ブログやtwitterで一方的によく知っている人たちに生で会えるということも目的の一つに参加してきました。 C++11 : variadic template のご紹介 発表者 επιστημηさん 資料 http://www.slidesh…

Visual C++ 12.0で boost iterator concepts がコンパイルエラーになる

C++

以下のコードがVisual C++ 12.0でコンパイルエラーになります。Boostのバージョンは1.55です。 #include <boost/iterator/iterator_concepts.hpp> int main() { } 出力 http://melpon.org/wandbox/permlink/oJdAALJZbyRJgIiG iterator_concepts.hpp(43): error C2448: 'BOOST_concept' : 関数の定義</boost/iterator/iterator_concepts.hpp>…

C++14の言語機能の一部で少しサンプルを

C++

clang3.4で動きました。 #include <type_traits> #include <cassert> //通常の関数の戻り値の型推論 template <class T, class U> constexpr auto add(T t, U u) { return t + u; } //constexpr関数の制限緩和 constexpr int factorial(int n) { int sum = 1; for (int i = n; 0 < i; --i) { sum *= i</class></cassert></type_traits>…

to_index, to_iterator書いてみた

C++

N3450を見て、非メンバ関数版のto_index, to_iteratorなんとなく書いてみました。本当ならクラスのメンバ関数ですが、気にせずに…。 #include <iterator> #include <type_traits> template <class Container> auto to_index(const Container& container, typename Container::const_iterator it) -> d</class></type_traits></iterator>…

ぼくのかんがえたさいきょうのC++ライブラリ

C++

実現したい機能を決めます。 その機能を実装する際の実装の選択肢をポリシーとして抽出します。 共通のインターフェイスで扱えるようにポリシーのtraitsを作ります。 自作ポリシーに特殊化したtraitsを作ります。 完成

マルチメソッド3 力任せ改良編

C++

マルチメソッド2 力任せ編の続きです。Modern C++ Designに載っているマルチメソッドを自分なりの解釈を加えながら、LokiライブラリではなくBoostライブラリを用いて実装してみようという試みです。 前回書いたように今回はstatic_dispatcherの改良として、…

マルチメソッドまとめ

C++

Lokiのマルチメソッドライブラリの実装がどうなっているのか調べて理解しつつ、BoostやC++11で書きなおして使おうという目的。 専用のカテゴリを作ってもカテゴリが増えて煩雑になるので、関連する記事はそれらを纏めた記事を作ることで纏めようと思います。…

適切なキャストを呼び分けてくれる関数テンプレートをSFINAEを使って書いてみた

C++

前回の記事のSFINAE版

適切なキャストを呼び分けてくれる関数テンプレート書いてみた

C++

はてなブログのGistのソースコード貼り付けが公式で対応したのでそれの試用も兼ねて。 好奇心でこういった関数テンプレートを作れるんじゃないかと思って挑戦してみました。 C++でキャストの種類ごとに長い名前付いた理由を考えればこのような関数テンプレー…

C++で文字列を数値に変換する方法

C++

元ネタに載っている変換方法を使ったサンプルを書いてみた。*1 atoi #include <cstdlib> #include <iostream> #include <string> #include <typeinfo> int main() { const std::string str("123"); auto num = std::atoi(str.c_str()); std::cout << typeid(num).name() << " : " << num << std::e</typeinfo></string></iostream></cstdlib>…

マルチメソッド2 力任せ編

C++

マルチメソッド1 自作編の続きです。 ここからはModern C++Design に載っている方法を1つずつ試したいと思います。 その際、Boost.Mplを使用しています。生ポインタ使っています。スマートポインタを使うべきですが、本のサンプルをなるべくそのまま使いたい…

マルチメソッド1 自力編

C++

Modern C++ Designに載っている話です。マルチメソッドとは多重ディスパッチとも言い、関数を複数の引数の動的な型によって呼び分けることです。ゲームで、2つのオブジェクトによって最適な衝突判定関数を呼び分ける時などに使えます。*1 どうにかして擬似的…

式テンプレートっぽい何か

C++

boost::numeric::ublas::vectorのExpression Templatesってどうやって実装してるのか気になり、ヘッダを眺めて大事そうなとこだけ真似(劣化コピー)してみました。 式自体を定義しているヘッダです。 //ファンクタを適用する式 #ifndef NEK_MATH_VECTOR_EXPRE…

プリプロセッサを使ってmake_array書いてみた

C++

C++11の機能を使ったmake_arrayはこちらを参照して下さいmake_array 書いてみた - とくにあぶなくないRiSKのブログVisual C++ Nov 2012 CTPで可変長テンプレート引数対応とのことですが、不完全なうえ標準ライブラリが可変長テンプレート引数未対応なのでま…

ローカルクラス

C++では関数内にもクラスを定義することができます。このクラスはローカルクラスと呼ばれ、静的メンバを定義できない、ローカル変数にアクセス出来ない、関数の外からインスタンス化ができない、などの特徴があります。 ローカルクラスの使いどころを2つ紹介…

STLコンテナの要素の削除方法

シーケンスコンテナ(vector, string, deque)とlistと連想コンテナ(set, map, 以下略)、の3つに分けて整理します。 "c"は、その時のコンテナのインスタンスを表します。std::を省略しています。完全なコードではありません。 特定の値を削除したい時 ・シーケ…

型特性によるオーバーロード

型特性によるオーバーロードはいくつか方法がありますが、目的に合わせた方法をとるのが良いと思います。・何通りかの型特性でオーバーロードをしたい場合 ・ある型特性かどうかでオーバーロードしたい場合 ・ある型特性でしかオーバーロードしてほしくない…

コンストラクタを書いたつもりが関数宣言とみなされる

コンストラクタを書いたつもりが関数宣言とみなされる時があります。 これは俗に、「C++で最も奇妙な解析」と言われています。 以下の様な時です。 struct foo{}; struct hoge { //引数を1つ取るコンストラクタ hoge(foo f) : f_(f) { } void func(){} foo f…

decltype

C++

自分の理解が間違っているのか、MSVC Nov 2012 CTPが対応していないのか、が分からないのでブログに投げてみるテスト。 std::vector v; decltype(v)::value_type n; ってill formedですか? #include <vector> template <class T> struct type_holder { typedef T type; }; in</class></vector>…