c++

tupleを展開して、関数の引数にする。

c++

したいこと。 int main() { auto x = std::make_tuple(1, 2.0, "three"); auto f = [](auto a, auto b, auto c) { std::cout << typeid(a).name() << std::endl; std::cout << typeid(b).name() << std::endl; std::cout << typeid(c).name() << std::endl; …

C++でC#のクエリのようなものを作る。

c++

最近、C#を勉強していてlinqのクエリ(?)がすごく便利だと感じたので、C++でそれっぽいのを作ろう。 進捗は select select_with_index select_unzip where where_with_index skip take zip を作成。使い方は下記の通り。 コードは GitHub - nishiba/query:…

Factory&Builderパターン再考

c++

インスタンスの生成方法について再考。 したいこと Dataの商品IDに応じて、違うルールでShelfを作りたい。 新しい商品を追加も容易にしたい。追加や変更するクラス、箇所を極力小さくしたい。 int main() { ProductId("c1").procedure<Screw1Builder, BoardBuilder, ShelfBuilder>(); ProductId("c2").pr</screw1builder,>…

Decolator, Mix-Inのような継承関係

c++

Decolatorパターンの場合、内部で持っているコンポーネントの振る舞いが分かりにくい。Mix-Inの場合、プロパティとなるClassがtemplate classとなってしまって、複雑になる。そこで、状況によってはあ下記のような継承もありかな。 RuleBaseはルール f : dou…

C++のクラスをC#で継承する。swig使用。

まさかこんなことができるとは思っていなかった。 やりたいこと C++で定義されたコードをC#で継承してい使用する。 参考 http://www.swig.org/Doc1.3/CSharp.html cpp class Base { public: virtual ~Base() {} virtual void tell() const = 0; }; class Cal…

Mix-InによるCloneableの実装

c++

したいこと clone関数を継承によって実装したい。 下記のような感じにしたい。 A, Bはクラスはclone関数をオーバーライドしていないけど、Cloneableを継承することで、cloneができるようになる。 struct B : public Cloneable とすることで、BはAを継承した…

std::vector<T>をC#から使えるようにする。

swigを使用。 SwigSample.i %include std_vector.i %template(VectorDouble) std::vector<double>; のようにすればよい。C#でVectorDoubleという名前でstd::vectorが使用できるようになる。あとはいつも通り swig -csharp -c++ SwigSample.i</double>

パースしたJSONを違うobjectに変換する。

c++

したいこと {"person" : {"name" : "testname", "age" : 29}} のようなデータから class Person { std::string _name; int _age; }; class Data { Person _person; }; のDataクラスに変換する。 ソースコード https://github.com/nishiba/object_creator int…

JSON構文

c++

JSONの原典 JSON JSONの構文 データは "name" : value データはカンマ区切り 波括弧{}はオブジェクト 角括弧[]は配列を表す JSONのvalueの型 数値 文字列 ブール 配列 オブジェクト null JSON構文チェック 下記サイトで構文を確認できる。 https://syncer.jp…

enum classをfor文で回す。

c++

#define GENERATE_ENUM_ITERATOR(T) \ inline T operator++(T& x) { return x = (T)(std::underlying_type<T>::type(x) + 1); } \ inline T operator*(T c) { return c; } \ inline T begin(T r) { return static_cast<T>(0); } \ inline T end(T r) { T l = T::LA</t></t>…

boost::spirit::qiを使って電卓っぽいものを作る。

c++

コードをgithubにアップ。 nishiba/boost_spirit_sample 実行し、”1 + max(2, 3) * 4"と入力すると、"13"と返ってくる。 ------------------------------------------------ # 1 + max(2, 3) * 4OK13 ------------------------------------------------