インスパイア元 → アヒル型
polymorphism:多態 てーのは実行時にオブジェクトの型を
判別してそれに応じてメソッドを呼び分けるんだけども、
templateを使ったcompile-time-polymorphism:コンパイル時多態ってワザがあるます。
静的ダックタイピングの裏返しってゆーかなんてゆーか
コンパイル時に型を判別し、それに応じて関数を呼び分けます。
#include <iostream>
#include <string>
// かわいい/みにくい識別子
struct pretty_category {};
struct ugly_category {};
// かわいいアヒルはコチラへ
template<typename Duckling>
void identify_(const Duckling& duckling, pretty_category) {
std::cout << duckling.str() << " はかわいいコ。くわっくわっ\n";
}
// みにくいアヒルはコチラへ
template<typename Duckling>
void identify_(const Duckling& duckling, ugly_category) {
std::cout << duckling.str() << " はやがて美しい白鳥に。\n";
}
// コンパイル時にかわいい/みにくいを判別して上のいずれかに振り分け
template<typename Duckling>
void identify(const Duckling& duckling) {
identify_(duckling, Duckling::category());
}
// ふつーのアヒルの子
class NormalDuckling {
public:
typedef pretty_category category;
std::string str() const { return "きいろいアヒルの子"; }
};
// みにくいアヒルの子
class UglyDuckling {
public:
typedef ugly_category category;
std::string str() const { return "みにくいアヒルの子"; }
};
int main() {
identify(NormalDuckling());
identify(UglyDuckling());
}
----- 実行結果 -----
きいろいアヒルの子 はかわいいコ。くわっくわっ
みにくいアヒルの子 はやがて美しい白鳥に。