茂加部珈琲店

主にtech関連のメモ置き場です

constexprでメンバ変数のオフセットを取得する

c++

constexprでも頑張ればメンバオフセットを取得できるみたいです。constexpr版offsetofですね コードはこのGithubでの議論あたりを参考にしました。 コンパイルにはc++17が必要です gcc 7.0 / clang 6.0 あたりでコンパイルできます。 msvcは VS2017 15.8 Pre…

VSCodeでMSYS2+fishを使う

settings.jsonに以下を追加すればよい "terminal.integrated.shell.windows": "C:\\Windows\\System32\\cmd.exe", "terminal.integrated.shellArgs.windows": [ "/K","C:\\msys64\\msys2_shell.cmd -mingw64 -defterm -no-start -here -full-path -c fish & …

フレキシブル配列メンバをC++で

c++

こんにちは。c++ネタ。 flexible array member プログラミングをしていると、大きさのわからない配列を扱いたい時があります。 間接参照を挟まず、構造体に直接配列を埋め込む手法はCなどではよく使われています こういった配列を扱うため、C99からはフレキ…

[g++7.1] ジェネリックラムダが不要な場合にもインスタンス化されるバグ

c++

ちょっと調べたのでメモ 以下のコードはg++ 7.1、g++7.2でコンパイルに失敗します。 #include <variant> template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; }; template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>; using v = std::variant<double, long, bool>; constexpr const cha</double,></ts...></class...></class...></variant>…

メンバ関数テンプレートでC2783が出る場合

c++

小ネタなのですが VC++(VS2017 15.5.2)で以下のコードはコンパイルに失敗します。 clangとgccでは通ります。 #include <type_traits> struct Foo { template <class U = int, class = std::enable_if_t<std::is_same_v<U,int>>> void f(); }; //template <class U, class> // <- Ok. template <class, class> // <- C2783: could not deduce template argument f…</class,></class></class></type_traits>

if constexprを失敗させる

if constexprを与えられた型によって失敗させる場合は、 型に依存したパラメータをstatic_assertに渡してやれば良いみたいです。 saka1_pさんの記事によれば、 template <typename T> constexpr bool false_v = false; のような定数を定義して、 // if constexprの内部で</typename>…

VSCodeでcmakeを走らせる

コマンド一つでcmakeやctestを走らせたかったのです。 VSCodeではtask.jsonを使って簡単にできるみたいです. WindowsではデフォルトのコンパイラはVC++なので、MinGWを指定してあります mingw-64でも動きました。 Ctrl+Shift+B で走ります { // See https://…

テンプレートで型情報を作る

c++

C++勉強ネタです テンプレートを使って、関数型言語の型情報を生成してみます(やっつけなのでバグがあるかも) 値型はValue, λ抽象はArrowになっています。 とりあえずValueには設定された文字列を格納し、Arrowは単にリストを作ってるだけです。 型Tが関数型…

可変長テンプレートでunion

C++勉強ネタが続きます templateを作って直和型もどきを作りたいときがあります。 これはすでにBoost Libraryで実現されていて、boost::variantとして利用できます。 また、C++1zでは、これが標準に追加されます。 今回は、可変長テンプレートを使ってこれを…

c++17のaggregate initialization

c++では、十分に「しょぼい」クラスに対して、aggregate initializationが使えるみたいです。 aggregate initializationはリスト初期化の一種で、 色々できることがありますが、例をあげると struct Foo { int i; float f; }; というクラスは、 Foo f = { 4,…

デフォルトテンプレート引数を持つクラスのstaticメンバを初期化する

template <class T, class = int> class Foo{ static int i; }; template <class T> int Foo<T>::i = 42; これは動きません。 template <class T, class = int> class Foo{ static int i; }; template <class T, class E> int Foo<T,E>::i = 42; こうやって全部きっちり書く必要があるみたいです</t,e></class></class></t></class></class>

有理Bスプライン曲線の非有理化

今回はNURBS曲線の小ネタです 非有理化と言っていますが、正しくは計算過程で一時的に次元を上げることができるよ、という話です これを利用すれば、有理化を考慮していないアルゴリズム(Bスプライン用の計算など)に、NURBSを適用することができます 有理化…

type traits(型特性)クラスの利用

c++

またまたc++勉強ネタ。 traitsクラス traitsクラスは、templateを利用したテクニックの一つです。 標準ライブラリや、boostなどで多用される手法の一つでもあります。 今回は、traitsクラスの基本的な利用法を勉強したいと思います。 traitsクラス type trai…

君はプライベートメンバにアクセスできるフレンズなんだね!

c++

いまだc++を勉強中です。今回はちょっとマイナーな機能、friendについて friend friendを使えば、クラスのプライベートメンバにアクセスできる外部関数を指定できます。 privateを指定すると、基本的に外部からのアクセスは禁止されるのですが、friendを使え…

NURBS曲線の特徴

CGの分野では解像度に非依存な形状を保存するために、パラメトリック曲線を利用することがあります. 今回は、その中でも特に自由度の高いNURBS曲線の基本的な事項をおさらいします. ベクタ形式ではBezier曲線が有名で、古くから使われていますが、Bezier曲線…

型情報の保存

c++

あけましておめでとうございます. 突然ですが、基底クラスから元の型を復元したいと思うことはないでしょうか.C++ではそのような型情報の保存を簡単に行えるみたいです. 具体的には、仮想関数を利用して型情報を返す関数を定義します. #include <iostream> #include <typeinfo> s</typeinfo></iostream>…

virtualなデストラクタ

c++

C++では、ポリモーフィズムを利用するために作成した基底クラスのデストラクタにはvirtualを付けることがあるようです. virtualがないと、基底クラスのポインタで管理している場合は、基底クラスのデストラクタのみが呼ばれてしまうためです. 初心者は「そん…

単純な三角メッシュ

はてなのマークダウンの練習 CGの入門書に書いてあるようなやつです メッシュ構造 メッシュ構造は3DCGで利用される3Dモデルの表現法です. ここでは、シンプルなobjファイルで使われるような、頂点+三角形で構成されるメッシュ構造を書いてみました template <typename T></typename>…

Fiio D03Kで遊ぶ

Fiio D03K Fiio D03Kは安価なSPDIF入力のDACです. 入力は192KHz,24bitで光、同軸入力をサポートします. どこかに192KHzは同軸のみと書いてありましたが、私の環境では光でも192KHz/24bitを受けれています. オヤイデが代理店をやってるみたいです.高級オーデ…