C++ templateメモ
ベースクラスの取得
メンバ変数でイテレート
- https://stackoverflow.com/questions/17660095/iterating-over-a-struct-in-c
- unionを使うテクニック
- C++14の機能とboost fusionに触れているリンク
- https://stackoverflow.com/questions/19059157/iterate-through-struct-and-class-members
- magic getというライブラリで使っているテクニック
- 検索ワード
ベースクラスのtypedefが子クラスで見えない
- 検索ワード
- https://stackoverflow.com/questions/13405715/template-base-class-typedef-members-invisible
- https://stackoverflow.com/questions/33484694/accessing-base-class-typedef-in-derived-class-template
- テンプレートクラスではコンパイラはベースクラスをインスタンス化するまでベースクラスに定義されている型が分からないので子クラスで
typename Base<T>::Vec_tという様にベースクラスまで書かないと駄目。
メタ関数まとめ
テンプレートパラメータのネスト
テンプレートで配列のサイズを取得する
- https://stackoverflow.com/questions/3368883/how-does-this-size-of-array-template-function-work
- https://codereview.stackexchange.com/questions/190881/c-template-class-for-variable-length-arrays-with-maximum-size-for-good-cache-l
- https://stackoverflow.com/questions/16505376/how-to-pass-array-to-function-template-with-reference
- https://stackoverflow.com/questions/1745942/c-template-parameter-in-array-dimension
- https://stackoverflow.com/questions/34439284/c-function-returning-reference-to-array
- https://stackoverflow.com/questions/17258749/is-there-a-way-of-casting-a-pointer-to-an-array-type
- https://stackoverflow.com/questions/20046429/casting-pointer-to-array-int-to-int2
CRTP
- https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
- https://stackoverflow.com/questions/1412348/is-it-possible-to-return-a-derived-class-from-a-base-class-method-in-c
アクセサの話
template関係ないけど
offsetof
decltype
- https://stackoverflow.com/questions/13089067/can-c11-decltype-be-used-to-create-a-typedef-for-function-pointer-from-an-exis
- https://stackoverflow.com/questions/52617204/error-functional-cast-to-array-type-while-trying-to-detect-if-stdcout-t-i
- https://qiita.com/yoshiya0503/items/ffde6a7e2b009ac07079
templateパラメータのintの値を取得する
暗黙的なテンプレートのインスタンス化を防ぐ
- https://cpppatterns.com/patterns/class-template-sfinae.html
- https://stackoverflow.com/questions/30472564/how-do-i-prevent-implicit-template-instantiations-for-a-specific-template
パラメーターパック
基本
template<typename… Args>
void Func(Args… args) // Args… で型が幾つかの意味
{
sizeof…() // パラメーターパックの要素数を取得
static_assert(sizeof…(args) < 4);
}
テンプレートパラメーターとしてパラメーターパックを渡す
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
template<typename... Args> inline void PrintParameterPackLength(std::vector<Args> const&... args) { std::cout << sizeof...(args); } int main() { // cross { std::vector<int> a{1, 2}; std::vector<float> b{1.f, 2.f}; Cross(a, b); } return 0; } |
パラメーターパックの拡張
パラメーターパックに共通の処理(関数)を適用できる。パラメーターパックの拡張ができるのは、C++14では()と{}内のみである。
完全転送
関数から内部関数を呼び出すときに引数を「そのまま」転送したい場合に使用する。
その方法としてl-value参照を使うとr-valueが渡されたときにビルドエラーになる。
inner(int& a, float& b){}
func(int a, float b){ inner(a, b) }
func(a, 1); // 1は渡せないためコンパイルエラー
参考: stack overflow
コメントを残す