7

私が持っているのがコンパイラのバグなのか、それとも私がやろうとしていることの構文がわからないだけなのかはわかりません。2 つの配列参照を取る関数を想像してください。

void takeArrays(const char (&str1)[4], const char (&str2)[4]) {
}

これは、次のように呼び出すと正常にコンパイルされます。

takeArrays("foo", "bar");

なぜ私はこれをしたいのですか?渡すconst char*と文字列リテラルのサイズ情報が失われるため、これは私がやっていることにとって重要です。

ただし、私が本当にやりたいことは、可変数の配列参照を渡すことです。これは、物事が少し醜くなるところです(悪化します)。私は単純にこれを試しました:

template<typename... Args>
void takeArrays(const char (&Args... strs)[4]) {
}

そして得た"error: variable or field ‘takeArrays’ declared void""error: expected primary-expression before ‘const’"gcc 4.6)。だから私はこれを試しました:

template<typename... Args>
void takeArrays(const char (&(Args... strs))[4]) {
}

"no matching function for call to ‘takeArrays(const char [4], const char [4])’"とを得"candidate is template<class ... Args> void takeArrays(const char (& (*)(Args ...))[4])"た。これは読めませんが、私が望むものに近いようです。多くのバリエーションを試しましたが、コンパイルできないようです。

上記を適切に記述する方法があると仮定すると、私が本当にやりたいことは次のように呼び出すことです。

takeArrays("foo", "foobar", "longerstring");

そして、異なるサイズの配列の可変長リストを取得します。つまり、上記の呼び出しはコンパイラによって次のように展開されます。

void takeArrays(const char (&str1)[4], const char (&str2)[7],
                const char (&str3)[13]);

これは私がやろうとした最初の考えであり、私の試みは次のようなものでした:

template<size_t... Sizes>
void takeArrays(const char (&strs)[Sizes]...);

言うまでもなく、私が得たのはエラーメッセージだけでした。私がやろうとしていることは少しクレイジーですが、それが可能かどうか、可能であれば適切な構文は何かを知りたいです。前もって感謝します。

4

1 に答える 1

10

同じ要素型の可変長配列の構文は次のとおりです。

template<size_t... Sizes>
void takeArrays(const char (&...args)[Sizes]);

これは、一般的な可変長 const 参照構文に似ています。

template<typename... Args>
void takeArrays(const Args &...args);

覚えやすい方法は、省略記号がパラメーター名の直前にあることです。

于 2012-11-06T17:54:45.960 に答える