掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
boostのtype_traitsを使ってテンプレートを切り替えたい (ID:68362)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
開発環境はVisualC++2005ExpressEditionです。 boost version1.34.1を使ってます。 現在、テンプレート引数がPOD型か非POD型かによって切り替わるクラステンプレートを作っています。何とか下記のように出来上がりました。 template<typename T,typename = void> class MyClass; //非POD特化版 template<typename T> class MyClass<T,typename boost::disable_if<boost::is_pod<T> >::type> { public: MyClass(); ~MyClass(); }; //POD特化版 template<typename T> class MyClass<T,typename boost::enable_if<boost::is_pod<T> >::type> { public: MyClass(); ~MyClass(); }; //Constructor(非POD特化版) template<typename T> MyClass<T,typename boost::disable_if<boost::is_pod<T> >::type>::MyClass() { std::cout << "Constructor(NotPOD)\n"; } //Constructor(POD特化版) template<typename T> MyClass<T,typename boost::enable_if<boost::is_pod<T> >::type>::MyClass() { std::cout << "Constructor(POD)\n"; } //Destructor(非POD特化版) template<typename T> MyClass<T,typename boost::disable_if<boost::is_pod<T> >::type>::~MyClass() { std::cout << "Destructor(NotPOD)\n"; } //Destructor(POD特化版) template<typename T> MyClass<T,typename boost::enable_if<boost::is_pod<T> >::type>::~MyClass() { std::cout << "Destructor(POD)\n"; } HRESULT Test(int argc,TCHAR const* argv[]) { argc;argv; MyClass<unsigned int> obj; MyClass<std::string> obj2; return S_OK; } Testの実行結果 Constructor(POD) Constructor(NotPOD) Destructor(NotPOD) Destructor(POD) 一応できたのですが、切り替えたいのはメソッドの実装のみであって、クラス定義の部分はまったく同じです。だから、クラス定義の部分を下記のように一つにまとめれないかと思ったのですが template<typename T> class MyClass<T,void> { public: MyClass(); ~MyClass(); }; そうすると、POD特化版非POD特化版それぞれのConstructorとDestructor計4つのメソッドがすべてC2039(メンバではないというエラー)で怒られました。 なんとかスマートに記述する方法はないでしょうか? よろしくお願いします。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.