「オブジェクト指向におけるFizzBuzz問題」のような何か

元ねた:オブジェクト指向における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しか触ってない組み込み屋さんのお遊びでした。