2018年01月19日
《その245》 問題演習 p.325演習9-1
新版明解C++中級編 p.325 演習9-1
次のプログラムに、char型に特殊化した挿入子を追加せよ。
表示する文字を単一引用符 「 ' 」 で囲んで表示すること。
#include <utility>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
// 2値(同一Type型)クラステンプレート
template <class Type> class Twin {
Type v1;
Type v2;
public:
Twin(const Type& f = Type(), const Type& s = Type())
: v1(f), v2(s) { }
Twin(const Twin<Type>& t)
: v1(t.first()), v2(t.second()) { }
Type first() const { return v1; } // v1 のゲッタ
Type& first() { return v1; } // v1 のゲッタ かつ セッタ
Type second() const { return v2; } // v2 のゲッタ
Type& second() { return v2; } // v2 のゲッタ かつ セッタ
// v1, v2 のセッタ
void set(const Type& f, const Type& s) { v1 = f; v2 = s; }
// 小さいほうの値を返します。
Type min() const { return v1 < v2 ? v1 : v2; }
// vi < v2 なら真、そうでなければ偽
bool ascending() const { return v1 < v2; }
// 小さい順にソートします。
void sort() { if (!(v1 < v2)) std::swap(v1, v2); }
};
// 挿入子
template <class Type>
inline std::ostream& operator<<(
std::ostream& os, const Twin<Type>& t
) {
return os << "[" << t.first() << ", " << t.second() << "]";
}
// 挿入子 Twin<string>型への特殊化
template <>
inline std::ostream& operator<<(
std::ostream& os, const Twin<std::string>& st
) {
return os << "[\"" << st.first()
<< "\", \"" << st.second() << "\"]";
}
int main() {
Twin<Twin<int> > t1(Twin<int>(11, 12), Twin<int>(61, 99));
cout << "t1 = " << t1 << '\n';
Twin<Twin<string> > t2(
Twin<string>("abc", "xyz"), Twin<string>("012", "789")
);
cout << "t2 = " << t2 << '\n';
}
// 解答
#include <utility>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
template <class Type> class Twin {
Type v1;
Type v2;
public:
Twin(const Type& f = Type(), const Type& s = Type())
: v1(f), v2(s) { }
Twin(const Twin<Type>& t)
: v1(t.first()), v2(t.second()) { }
Type first() const { return v1; }
Type& first() { return v1; }
Type second() const { return v2; }
Type& second() { return v2; }
void set(const Type& f, const Type& s) { v1 = f; v2 = s; }
Type min() const { return v1 < v2 ? v1 : v2; }
bool ascending() const { return v1 < v2; }
void sort() { if (!(v1 < v2)) std::swap(v1, v2); }
};
// 挿入子
template <class Type>
inline std::ostream& operator<<(
std::ostream& os, const Twin<Type>& t
) {
return os << "[" << t.first() << ", " << t.second() << "]";
}
// 挿入子 Twin<string>型への特殊化
template <>
inline std::ostream& operator<<(
std::ostream& os, const Twin<std::string>& st
) {
return os << "[\"" << st.first()
<< "\", \"" << st.second() << "\"]";
}
// 挿入子 Twin<char>型への特殊化
template <>
inline std::ostream& operator<<(
std::ostream& os, const Twin<char>& ct
) {
return os << "['" << ct.first()
<< "', '" << ct.second() << "']";
}
int main() {
Twin<Twin<int> > t1(Twin<int>(11, 12), Twin<int>(61, 99));
cout << "t1 = " << t1 << '\n';
Twin<Twin<string> > t2(
Twin<string>("abc", "xyz"), Twin<string>("012", "789")
);
cout << "t2 = " << t2 << '\n';
Twin<Twin<char> > t3(
Twin<char>('a', 'z'), Twin<char>('0', '9')
);
cout << "t3 = " << t3 << '\n';
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7216300
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック