アフィリエイト広告を利用しています

広告

posted by fanblog

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';

}

f09_0004.png




この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7216300
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。