4

次の不自然な (そして、ひどい) 例を考えてみます。

template<typename... Args>
void something(Args... args)
{
    std::tuple<Args...> tuple; // not initializing for sake of example
    std::get<0>(tuple) = 5;
}

次のように呼び出すと機能します。

int x = 10;
something<int>(x);

ただし、次のように呼び出すと機能しません。

int x = 10;
something<int&>(x);

5 への代入のため。何らかの理由でタプルが定義されているときにタプルを初期化できないと仮定すると、型を参照として指定するときにこれを機能させるにはどうすればよいでしょうか?

具体的には、 isのstd::tuple<int>場合でもタプルをしたいと思います。Args...int&

これの実際のユースケースには、文字列をタプルに逆シリアル化することが含まれます。ここでArgs...、タプルをアンパックすることによって呼び出される関数へのパラメーターの型です。関数が参照によってパラメーターを受け取る場合を除いて、すべてうまく機能します。

私は gcc 4.5.2 を使用していますが、このコンパイラにはまだ実装されていない回答を受け入れます。

4

2 に答える 2

12

あなたの質問がわかりません。このコードは GCC で正常に動作し、動作しない理由がわかりません。

#include <tuple>

template<typename... Args>
void something(Args... args)
{
  std::tuple<Args...> tuple{args...};
  std::get<0>(tuple) = 5;
}

int main() {
  int x = 10;
  something<int&>(x);
}

[js@HOST2 cpp]$ g++ -std=c++0x main1.cpp
[js@HOST2 cpp]$

「テンプレートを初期化する」の意味がわかりません。


質問を更新したので、回答を更新できます

template<typename... Args>
void something(Args... args)
{
  std::tuple<typename std::decay<Args>::type...> tuple;
  std::get<0>(tuple) = 5;
}

decayconst/を削除volatileし、参照を削除し、配列と関数の型をそれぞれ要素と関数のポインターに変換します。それがあなたが探しているようです。

于 2011-02-26T06:56:09.580 に答える
5

試しましたstd::tuple<std::remove_reference<Args>...>か?

于 2011-02-26T07:44:48.733 に答える