ストラウストラップのプログラミング入門(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);
}

どうも出題意図を汲み取れません。サテハテ…(理解を保留にするかな…)