最新のC ++可変長パラメーターテンプレート

1.可変長パラメーターテンプレートの定義

C ++ 11以降、C ++は可変長パラメーターテンプレートのサポートを開始し、任意の数とタイプのテンプレートパラメーターを許可し、パラメーターを定義するときにパラメーターの数を修正する必要はありません。その形式は次のように定義されます。

template<typename... Ts> class Variadic;

そのテンプレートのインスタンス化:

1.0個のパラメーターを持つテンプレートクラスVariadic <> zero;

2.マルチパラメータテンプレートクラスVariadic <int、double、std :: string、std :: list <int >>サンプル;

次のように定義されている、少なくとも1つのパラメーターを必要とするテンプレートクラスを定義することもできます。

template<typename T, typename... Args> class Variadic;

2.可変長パラメータの特徴的な識別

1.可変長パラメータの数を取得します

ツール:sizeof .. ..

#include <iostream>

using namespace std;

template<typename... Args>
void func(Args... args)
{
    cout << "the count of 'args': " << sizeof...(args) << endl;
}

int main(int agrc, char* argv[])
{
    func();
    func(1);
    func(1, 2);
    func(1, 2, 3);
    
    return 0;
}

プログラム標準出力:

the count of 'args': 0
the count of 'args': 1
the count of 'args': 2
the count of 'args': 3

2.開梱

    1.再帰テンプレート関数

     テンプレートパラメーターを関数に再帰的に渡して、すべてのテンプレートパラメーターを再帰的にトラバースするという目的を達成します。

#include <iostream>

template<typename T0>
void my_printf(T0 value) 
{
    std::cout << value << std::endl;
}

template<typename T, typename... Ts>
void my_printf(T value, Ts... args) 
{
    std::cout << value << std::endl;
    my_printf(args...);
}

int main() 
{
    my_printf(1, 1000, "123", 1.123, "HahaahaH");
    return 0;
}

プログラム標準出力:

1
1000
123
1.123
HahaahaH

   2.可変パラメータテンプレートの拡張

    テンプレートパラメータを再帰的に解凍するのは、書くのが少し面倒です。C ++ 17は、可変パラメーターテンプレートの拡張のサポートを開始しました。上記の例の実装は、次のコードに置き換えることができます。

template<typename T, typename... Ts>
void my_printf(T value, Ts... args) 
{
    std::cout << value << std::endl;
    if constexpr(sizeof...(args) > 1)
        my_printf(args...);
}

   3.初期化リストの拡張

   カンマ式とstd :: initializer_listの特性を使用します。

template<typename T, typename... Ts>
void my_printf(T value, Ts... args) 
{
    std::cout << value << std::endl;
    (void)std::initializer_list<T>{([&args]{
        std::cout << args << std::endl;
    }(), value)...};
}

   4.折りたたみ式

   C ++ 17がサポートを開始しました(実際、C ++コンパイラは変数パラメータタイプをプッシュする機能を強化しました)。次のコードは、n個のデータの合計を実装します。

#include <iostream>

template<typename ... T>
auto sum(T ... t) 
{
    return (t + ...);
}

int main() 
{
    std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
    return 0;
}

   平均を見つける:

#include <iostream>

template<typename ... T>
auto average(T ... t) 
{
    return (t + ...)/sizeof...(t);
}

int main() 
{
    std::cout << average(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
    return 0;
}

 

おすすめ

転載: blog.csdn.net/xunye_dream/article/details/114761058