class Base{ public: virtual int GetID()=0; virtual ~Base(){} }; template <typename classname> class BaseImpl:Base{ int GetID(){ return IndexOf<classname>::value; } }; class class1:public BaseImpl<class1>{ };
class AbortType{ public: AbortType(){abort();} }; class Factory{ public: Base * Create(int ID){ switch(ID){ case 0:return new TypeAtNonStrict<ClassList,0,AbortType>::Result; case 1:return new TypeAtNonStrict<ClassList,1,AbortType>::Result; case 2:return new TypeAtNonStrict<ClassList,2,AbortType>::Result; //... } //static Base * (*Funcptr[ClassList])()={TypeAtNonStrict<ClassList,0,AbortType>::Result::operator new(), //TypeAtNonStrict<ClassList,1,AbortType>::Result::operator new()}; abort(); }; }; Factoryはperlとか使って出力しておく。 templateスレへ行けとか言われそうな気もするけど思いついたので。 typelistとかTypeAtとかも書くと長くなりそうなので省略
% g++ a.cpp /tmp/ccC2TuDO.o: In function `Hoge::Hoge(void)': /tmp/ccC2TuDO.o(.Hoge::gnu.linkonce.t.(void)+0x5): undefined reference to `Hoge::x' collect2: ld returned 1 exit status
Function exception specifiers other than throw() are parsed but not used. For example:
void f() throw(int); // parsed but not used void g() throw(); // parsed and used For more information on exception specifications, see Exception Specifications.
>>165 これは、例えば int の 4 バイト(の環境として)が 連続する 4 つのバイトに確保される、ということでは?
○ xxxxooooxxxxxxxx × xxxxooxxoxxxoxxx
で、規格見つけた。
5.3.3 -2- より抜粋 When applied to a class, the results is the number of bytes in an object of that class including any padding required for placing objects of that type in an array. クラスに(sizeof を)適用した場合の結果は、 配列として配置した場合に要求されるあらゆるパディングを含めた、 そのクラスのオブジェクトのバイト数になる。