ベースクラスの取得

メンバ変数でイテレート

ベースクラスのtypedefが子クラスで見えない

メタ関数まとめ

テンプレートパラメータのネスト

テンプレートで配列のサイズを取得する

CRTP

アクセサの話

template関係ないけど

offsetof

decltype

 

templateパラメータのintの値を取得する

暗黙的なテンプレートのインスタンス化を防ぐ

パラメーターパック

基本

template<typename… Args>
void Func(Args… args) // Args… で型が幾つかの意味
{
sizeof…() // パラメーターパックの要素数を取得
static_assert(sizeof…(args) < 4);
}

テンプレートパラメーターとしてパラメーターパックを渡す

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