1

これはかなり簡単な質問です。

私は機能を持っています:

template<class T> T& read(T& value)
{
    // Read an value of type T and assign it to variable "value"
    return value;
}

これで、関数を次のように使用できます。

char c;
read(c);

しかし、私はこの関数を次のように使用したいと思います。

char c = read(char());

それは可能ですか、それとも私はそれを次のように使用する必要がありますか?

char c = read<char>();

?(後者では、関数を少し調整する必要があることを知っています)

4

5 に答える 5

1

いいえ、そうではありません。一時的な (your char()) は非 const 参照にバインドできないためです。要件により、参照を const にすることはできません ("型 T の値を読み取り、それを変数 "値" に割り当てます")。

別の方法:

template<class T> T read()
{
    // Read an value of type T and assign it to variable "value"
    return T();
}

//...
c = read<char>();
于 2012-10-17T12:18:58.823 に答える
1

いいえ、できませんし、おそらくしたくないでしょう。非 const 参照パラメータにテンポラリをバインドすることはできません。とにかく値を返し、パラメータに代入することの用途は何ですか? これは意味がありません。

これを使用するだけです:

template<class T> T read()
{
    // Read an value of type T and assign it to variable "value"
    return value;
}

&EDIT:戻り値からを削除しました。

于 2012-10-17T12:21:01.973 に答える
0

あなたが最初に与えたものは実際には意味がありません。考えてみてください。匿名の値を渡します。変数はそれにバインドされていません。では、どのように割り当てることができますか?何が変わるのでしょうか?

は右辺値であるためchar()、非定数参照として使用することはできません。これは、左辺値でのみ実行できます。

この場合、すべてを一緒に参照する必要はありません。質問で説明したことを実行したい場合は、次を試してください。

template<typename T>
T readT(){
  T v;
  read(v);
  return v;
}

これで、次のように入力できます。

char c = readT<char>();

どちらがあなたが望むことをします。

于 2012-10-17T12:20:42.603 に答える
0

Tテンプレートでは、タイプへの編集可能な参照を取得し、そのタイプへの編集可能な参照を返す関数があることをコンパイラーに伝えたいので、それを as : として使用できますが、 as として使用することはchar c; read( c );できません。等号演算子の左側では使用できないため、編集できません (左辺値):は無効です。入力を変更したくない場合は、次のようにすることができます。read( char() )char()char() = 3

template< class T >
T read( const T& val ) {
    // do something with val and return a T
    return val;
}

次に、次のように呼び出すことができます:

read( char() );
read (char)1 );
char c = read( (char)2 );
read( c );

デフォルト値が必要な場合は、前の例と同じくらい簡単です。

template< class T >
T read( const T& val = T() ) {
    // do something with val and return a T
    return val;
}

そして、あなたは呼び出すことができますchar c = read<char>()

于 2012-10-17T12:25:35.437 に答える
0

わかりました、コメントありがとうございます。私の質問を理解してくださった方が全員いらっしゃるわけではないことに気付きました。しかし、いくつかは実行し、彼らの助けを借りて、次の 2 つのクラス関数を取得しました。

template<class T> void read(T& value)
{
    event::deserialize(value, *this);
}

template<class T> T read()
{
    T temp;
    event::deserialize(temp, *this);
    return temp;
}

これらの関数は、Stream という名前のクラスのメンバーであることに注意してください。

ご協力ありがとうございました!

于 2012-10-17T12:32:37.923 に答える