2

昨日、C ++の式パラメーターについて読みました:http: //www.learncpp.com/cpp-tutorial/144-expression-parameters-and-template-specialization/

テンプレートを使用する理由はわかっていますが、コンストラクターを使用して同じことを実行できるのに、なぜ式パラメーターを使用するのでしょうか。ああ、そしてもう1つ、テンプレートはプリコンパイラによって処理されますか?

前もって感謝します。

4

3 に答える 3

1

最初の質問の2番目の部分:いいえ、テンプレートはコンパイルされます。前処理されていません。

最初の部分に関しては、それらは非常に便利です。テンプレートの優れた機能に役立つ式パラメーターの最良の(そして最も単純な)例は、静的配列のサイズ制限です。

#include <iostream>

using namespace std;

template<typename T, size_t N>
void DoSomething(const T (&ar)[N])
{
    for (size_t i=0; i<N; ++i)
        cout << ar[i] << endl;
}

int main(int argc, char *argv[])
{
    int int_ar[] = { 1,2,3,4,5 };
    DoSomething(int_ar);

    char char_ar[] = {'a', 'b', 'c'};
    DoSomething(char_ar);

    std::string str_ar[] = {"This", "is", "a", "string", "array."};
    DoSomething(str_ar);

    return EXIT_SUCCESS;
}

出力

1
2
3
4
5
a
b
c
This
is
a
string
array.

このようなことは、式パラメーターなしでは不可能です。これらは、特にサイズの削減が必要な場合に非常に便利です。

于 2012-11-22T21:19:09.363 に答える
1

簡単な例-C++11配列(およびブーストは以前も同様でした)。 http://en.cppreference.com/w/cpp/container/array

静的配列は、変数を使用できない1つのケースですが、テンプレートパラメーターは使用できます。

定数(テンプレートパラメータ)を使用すると、他の場合でもより効率的になる可能性があります。

プリプロセッサはテンプレートに触れず、#whatever行の実行、マクロの展開、コメントの削除などを行います。

于 2012-11-22T21:08:49.910 に答える
1

テンプレートクラスを使用すると、コンパイル時に展開され、通常のクラスのようにコンパイルされます。コンストラクターでパラメーターの代わりに式パラメーターを使用する理由の1つは、式が型の一部になることです。したがって、そのタイプのすべてのオブジェクトは同じ値を使用することが保証されます。

リンクした例では、次のようになります。

// declare an integer buffer with room for 12 chars
Buffer<int, 12> cIntBuffer;

cIntBufferは、Bufferクラスのインスタンスです。サイズ12のintバッファーがあることが保証されています。

Buffer<int> cIntBuffer1(12); 
Buffer<int> cIntBuffer2(13);

cIntBuffer1とcIntBuffer2は同じタイプのオブジェクトですが、バッファーサイズが異なります。

于 2012-11-22T21:06:22.780 に答える