「オブジェクト指向におけるFizzBuzz問題」のような何か
遊んでみますた。
#include <iostream> #include <locale> #include <map> #define WAN0_ "うるさいっておこられたわん" #define WAN1_ "わん" #define WAN2_ WAN1_ WAN1_ #define WAN3_ WAN2_ WAN1_ #define WAN4_ WAN3_ WAN1_ #define WAN5_ WAN4_ WAN1_ #define WAN6_ WAN5_ WAN1_ #define WAN(n) WAN##n##_ class Animal { public: Animal() { } void Cry() { if ( 0 == this ) { std::cout << "わたしはだ〜れ〜?" << std::endl; return; } Cry_impl(); } void SetCount( int c ) { SetCount_impl( c ); } protected: virtual void Cry_impl() { std::cout << "はやくにんげんになりた〜い" << std::endl; } virtual void SetCount_impl( int c ) { } }; class Dog : public Animal { friend class DogN_; public: Dog() : Animal() { SetCount_impl( 1 ); } private: void Cry_impl() { dog->Cry(); } void SetCount_impl( int c ) { if ( Dog::dogs.end() == Dog::dogs.find( c ) ) { dog = 0; } else { dog = Dog::dogs[c]; } } class DogN_{ public: DogN_( int n ) { Dog::regist( n, this ); } void Cry() { if ( 0 == this ) { std::cout << "なけないわん" << std::endl; return; } Cry_impl(); } private: virtual void Cry_impl() = 0; }; static void regist( int n, DogN_ * const d ) { Dog::dogs[n] = d; } public: typedef std::map< int, class Dog::DogN_* > dog_map; private: DogN_* dog; static dog_map dogs; #define IMPL_DOG(N) class Dog##N##_ : public DogN_ { public: Dog##N##_() : DogN_( N ) {} void Cry_impl() { std::cout << WAN(N) << std::endl; } }dog##N; IMPL_DOG(0); IMPL_DOG(1); IMPL_DOG(2); IMPL_DOG(3); IMPL_DOG(4); IMPL_DOG(5); IMPL_DOG(6); }; Dog::dog_map Dog::dogs; class Cat : public Animal { public: Cat() : Animal() { } private: void Cry_impl() { std::cout << "にゃん" << std::endl; } void SetCount_impl( int c ) { } }; int main() { std::locale( "" ); Animal* a = 0; a = new Dog(); a->Cry(); a->SetCount( 3 ); a->Cry(); a = new Cat(); a->Cry(); return 0; }
単にマクロで遊びたかっただけです orz
(DogとCatをdeleteしてないのはめんどくさかったからですYO)
template使ってもっと変態的なコード作っちゃう人もいるんだろうな。
uskzさんとか。
以上、最近Cしか触ってない組み込み屋さんのお遊びでした。