ストラウストラップのプログラミング入門(33) 19章ドリル
『ストラウストラップのプログラミング入門』を読む。19章のドリルで悩んでいます。不遜は承知ですが、ハマりすぎて19章に飽きてきました…。
問題はこんな感じです。
1. template
struct S { T val; }; を定義する。 (中略)
3. S
、S 、S 、S 、S< vector >型の変数を定義し、それらを選択した値で初期化する。 (中略)
12. cinからvに読み込む template
read_val(T& v) 関数を定義する。
まず、struct S を次のように定義しました。
# 上で省略した他のドリルも反映しています。
template<class T> struct S { S(): val(T()) { } S(T t): val(T(t)) { } const T& get() const; T& get(); void set(T t); T& operator=(const T&); private: T val; };
次に、ドリル12のread_val関数を、次のように定義しました。
template<class T> void read_val(T& v){ T tmp; if(cin >> (T)tmp){ v = tmp; } }
ここまではよいでしょう(よくなかったら誰か教えてください…)。問題は、ドリル13です。
13. read_val() を使用して、S< vector
>型の変数を除く3のそれぞれの変数に値を読み込む。
?
read_val関数は、T型の値の参照を戻します。といっても、明示的に戻すのではなく、引数として参照を渡すのですが。
そのread_valを使って、S
まさか、こう?
int main { S<int> si; int ri; read_val(ri); si.set(ri); }
いやいやいやいや…。
それとも、read_valをSクラスのメンバ関数として定義すればいいのでしょうか。問題文から、read_val関数はSクラスに属さない関数だと推測したのですが(というのも、他のドリルでメンバ関数の定義を出題する際には、「S
read_valをSのメンバ関数にする場合、たとえば、こうすれば、、、
template<class T> void S<T>::read_val2(T& v){ T tmp; if(cin >> (T)tmp){ v = tmp; val = v; // ★読み込んだ値をメンバ変数に代入 } }
変数に値を読み込んだ、といえなくもない?でしょうか?
int main { S<int> si; int ri; si.read_val2(ri); }
どうも出題意図を汲み取れません。サテハテ…(理解を保留にするかな…)