3

私は C++ テンプレートを初めて使用し、これらの C++ テンプレート関連のコードに遭遇しましたが、その意味を理解できません。

class StringBuffer
{
    CharBuffer cb;
..
    template <size_t ArrayLength>
    bool append(const char (&array)[ArrayLength]) {
        return cb.append(array, array + ArrayLength - 1); /* No trailing '\0'. */
    }
};

bool append(const char (&array)[ArrayLength])とはどういう意味ですか? 関数テンプレートは、特定の ArrayLength を持つパラメーターを取る何かにインスタンス化されるようです。しかし、関数の引数リストで配列の長さを指定することはできませんか? また、const char (&array)とはどういう意味ですか? const char &(括弧なし)のようなものであるべきではありませんか?

David Vandevoorde/Nicolai M.Josuttis による C++ Templates The Complete Guideという本を読んでいますが、この本のどの部分で上記の構文が説明されていますか?

4

5 に答える 5

4

「const char 配列への参照」を意味します。その理由は、あなたが

template <int S>
void f(T a[s]){}

主にポインターが配列サイズ情報を保持していないため、「配列パラメーターの廃止規則」に従ってサイズ情報が失われます。(AKA標準はそう言っています。)したがって、ポインター値ではなく参照渡しする必要があります。

[] は & の前に優先されるため、[] の前の括弧が必要です。したがって、& を優先するには、次のようにする必要があります。

 T (&a)[s]
于 2012-07-26T12:33:52.510 に答える
2

これは、参照によって配列を渡すための構文です (C++ では配列を値で渡すことができないため)。

void foo(const char (&array)[10]) { ... } // We can pass an array of lenth 10

10 の代わりにテンプレート パラメーターをミックスにスローします。コンパイラーはコンパイル時に配列のサイズを認識し、正しい値でテンプレートをインスタンス化できます。

template<size_t N>
void foo(const char (&array)[N])
{
    // use N, it'll be whatever the size of the array you instantiate the template with is
}
于 2012-07-26T12:36:27.993 に答える
2
const char (&array)[ArrayLength]

ArrayLengthタイプ のオブジェクトの配列への参照charです。

括弧がないと、参照の配列になり、許可されません。がないと&、(関数パラメーターとして) ポインターに減衰する配列になり、配列のサイズに関する情報が失われます。

関数テンプレートは、特定の ArrayLength を持つパラメーターを取る何かにインスタンス化されるようです。

それは正しい。配列の長さはコンパイル時にわかり、これにより、そのコンパイル時の値を使用できる関数がインスタンス化されます。

しかし、関数の引数リストで配列の長さを指定することはできませんか?

はい、追加の関数パラメーターとして長さを指定できます。しかし、それは実行時の値であり、それが正しいことを検証する既知の方法があります。テンプレートは、テンプレート引数が実際に配列のサイズであることを保証します。

本のどの部分が上記の構文をカバーしていますか?

私はその本を持っていませんが、目次を見て、この種のことについては 4.2 (非型関数テンプレート パラメーター) と 11 (テンプレート引数推論) を見ることをお勧めします。

于 2012-07-26T12:32:55.633 に答える
0

与えられたコードは良い教訓です: 最初は , 配列を渡したいので , 値で渡すことはできず、次に参照 (&) で渡します , 次に、安全に渡す const ワードで渡します. C/C++ には配列に制限があることはご存知のとおりです。このコードのプログラマーは、配列の長さのテンプレートを定義し、この問題を解決しました。

于 2012-07-26T12:38:55.300 に答える
0

この構文は、静的に割り当てられた配列引数のサイズに基づいてテンプレート パラメーターを設定します。

テンプレート化されたバージョンの「追加」(含めた) は、2 つの引数を取るオーバーロードを呼び出します: char へのポインターとカウント (これは含めませんでした)。

したがって、次のような配列がある場合があります。

const char my_string[] = "hi";

次のように「追加」メンバー関数を使用します。

my_string_buffer_object.append(my_string);

my_string の長さは自動検出され、ArrayLength パラメータが my_string の長さに設定されます。次に、"append" のより詳細なバージョンが呼び出され、文字列の長さが自動的に入力されます。

基本的に、このバージョンの「accept」は別のバージョンをラップします。唯一の引数として配列を渡すことができ、テンプレート パラメーターの情報を使用して長さを自動的に埋めます。

この構文を使用する場合、これらの配列の長さのパラメーターはオブジェクトのサイズではなく要素をカウントすることに注意してください (配列について sizeof が教えてくれます)。char の場合、これらは同じですが、より大きなサイズの要素型を持つ配列は、その sizeof よりも小さいテンプレート配列の長さパラメーターを生成します。

于 2012-07-26T13:17:04.320 に答える