C++ã§typenameãã¼ã¯ã¼ãã使ãã±ã¼ã¹ã¯ä»¥ä¸ã®2ã¤ãããï¼
- ãã³ãã¬ã¼ããã©ã¡ã¼ã¿ã宣è¨ããã¨ã
- ãã³ãã¬ã¼ãå ã«ãããã¹ããããä¾åååãæå®ããã¨ã(ä¾å¤ãã)
ãã³ãã¬ã¼ããã©ã¡ã¼ã¿ã®å®£è¨æ
ã²ã¨ã¤ã¯ãã³ãã¬ã¼ããã©ã¡ã¼ã¿ã宣è¨ããã¨ãï¼
template<typename T> void f(T t);
ããã¯ï¼ä»¥ä¸ã®ããã«typenameã®ä»£ããã«classã使ã£ãå ´åã§ãåãæå³ã¨ãªãï¼
template<class T> void f(T t);
ãã®å ´åï¼typenameã¨classã®ã©ã¡ãã®ãã¼ã¯ã¼ãã使ããã¯å¥½ã¿ã®åé¡ã¨ãªãï¼
ãã³ãã¬ã¼ãã«ãã¹ããããåã®æå®æ
ããã²ã¨ã¤ã¯ï¼ãã³ãã¬ã¼ããã©ã¡ã¼ã¿ã®åã«ãã¹ããããåãæå®ããã¨ãï¼
以ä¸ã®ããã«ï¼STLã³ã³ãããå¼æ°ã«åãï¼ãã®const_iteratorã使ã£ã¦ä½ããã®æä½ãè¡ãé¢æ°ãã³ãã¬ã¼ããèããï¼
template<class C> void f(const C &container) { C::const_iterator it(container.begin()); // ã³ã³ãã¤ã«ã¨ã©ã¼ ... }
ä¸ã®ã³ã¼ãã¯ã³ã³ãã¤ã«ã¨ã©ã¼ã¨ãªãï¼ä½æ ã ãããï¼
ãã¹ããããä¾ååã®ææ§ã
ããåã®ä¸ã«ãã¹ããããååãæå®ããã¨ãã¯ï¼é常ã::ããç¨ãã¦vector
ãã³ãã¬ã¼ããã©ã¡ã¼ã¿ã«ä¾åããååã®ãã¨ãä¸è¬ã«ãä¾ååãã¨ããï¼C::const_iteratorã¯ã¯ã©ã¹ã®å
é¨ã§å®ç¾©ãããä¾åå(ãã¹ããããä¾åå)ã§ããï¼ã¾ãï¼ããã¯ååãªã®ã§ï¼ãã¹ããããä¾åååã¨ãããã¨ãã§ããï¼
ãã¹ããããä¾ååã¯ãã°ãã°ã³ã³ãã¤ã«æã«åé¡ãå¼ãèµ·ããï¼ä¾ãã°ï¼C::const_iteratoråã¸ã®ãã¤ã³ã¿å¤æ°xãå®ç¾©ããããã«ä»¥ä¸ã®ã³ã¼ããæ¸ããã¨ããï¼
template<class C> void f(const C &container) { C::const_iterator *xï¼ // ? ... }
ãã®ã³ã¼ãã¯ï¼å®ã¯ã³ã³ãã¤ã©ã«ã¨ã£ã¦ã¯äºéãã®è§£éãã§ããï¼
- Cå ã§å®ç¾©ãããåã§ããC::const_iteratoråã¸ã®ãã¤ã³ã¿å¤æ°xã®å®ç¾©
- Cå ã§å®ç¾©ãããstaticãªãã¼ã¿ã¡ã³ãC::const_iteratorã¨å¤æ°xã®ç©(!?)
2çªç®ã®è§£éã¯ãªããªãç¡çãããããã«æãããï¼ããã§ãCã®è©³ç´°ãåãããªãæç¹ã§ã¯ã©ã¡ãã®ã±ã¼ã¹ãèããããï¼ãã®åé¡ã解決ããããã«ï¼C++ã§ã¯ããã³ãã¬ã¼ãå ã«ãããã¹ããããä¾ååã¯ï¼ç¹ã«æå®ããªããã°ååã¨ã¯è§£éãããªããã¨ããã«ã¼ã«ãããï¼ã¤ã¾ãï¼ä¸ã®ã³ã¼ãã¯2çªç®ã®è§£éãé©ç¨ããï¼CãSTLã³ã³ããã®å ´åã¯ã³ã³ãã¤ã«ã¨ã©ã¼ã¨ãªãï¼
typenameãã¼ã¯ã¼ãã«ããååã®æ示
ããã§ï¼åãæå®ãã¦ããã¨ãããã¨ãæ示ããããã«typenameãã¼ã¯ã¼ãã使ãå¿ è¦ãããï¼
template<class C> void f(const C &container) { typename C::const_iterator it(container.begin()); // OK ... }
ä¸ã®ã³ã¼ãã¯æå¾ éãã®åä½ãããï¼ãã®ããã«ï¼ãã³ãã¬ã¼ãå ã«ãããã¹ããããä¾åååãæå®ããã¨ãã¯typenameãã¼ã¯ã¼ãã使ãå¿ è¦ãããï¼ç¹ã«ï¼ãã³ãã¬ã¼ãã¡ã¿ããã°ã©ãã³ã°ã®éã«ãã®çç±ã§typenameãã¼ã¯ã¼ãã使ãå ´é¢ãå¤ãåºã¦ãã(ãBoost.MPLでBrainf*ckのプログラムをコンパイル時に動かしてみた - ぬいぐるみライフ(仮)ãã§ãããããtypenameã使ã£ã¦ãã)ï¼
typenameã使ããªãã±ã¼ã¹
ãã ãï¼ãã³ãã¬ã¼ãã«ãã¹ããããä¾åååãæå®ããå ´åã§ãtypenameãã¼ã¯ã¼ãã使ããªã(使ãå¿ è¦ããªã)ã±ã¼ã¹ãããï¼ããã¯ä»¥ä¸ã®2ã¤ã®å ´åï¼
- æ´¾çã¯ã©ã¹ã®å®ç¾©ã§åºåºã¯ã©ã¹ãæå®ããå ´å
- ã³ã³ã¹ãã©ã¯ã¿ã®åæåãªã¹ãã§åºåºã¯ã©ã¹ãæå®ããå ´å
以ä¸ã«ä¾ã示ãï¼
class Base { public: class Nested { // ãã¹ããããã¯ã©ã¹å public: explicit Nested(int) {}; }; }; template<class B> class Derived : public B::Nested { // typenameã¯ä¸è¦ public: explicit Derived(int x) : B::Nested(x) {} // typenameã¯ä¸è¦ }; int main(int argc, const char *argv[]) { Derived<Base> d(10); // OK return 0; }
ã©ã¡ããååããè¨è¿°ã§ããªãç®æãªã®ã§ï¼typenameãå¿ è¦ãªãã®ãç´å¾ã§ããã ããï¼
åèæç®
- Effective C++ 第3版 42é typenameã®2ã¤ã®æå³ãç解ããã