- 締切済み
あるクラスの派生クラスと、その他の型で処理を振り分
■環境 Windows7 Visual Studio 2010 Visual C++(C++11) 大抵の型は共通処理を行いたいが、ある特定の型だけは特別な処理を行いたい、 そんなケースでは、テンプレートの明示的な特殊化が利用出来るかと思います。 しかし、『ある特定の抽象クラスの派生クラス』だけは特別な処理を行いたい、 これを実現するには、どのようにするのがよろしいでしょうか? 以下のコードは、意図した通りに動作しません。 良い方法があれば、ご教授いただけますでしょうか? // 抽象クラス class AbstractClass { public: virtual void MustOverides() = 0; }; // 派生クラス class ChildClass : public AbstractClass { public: virtual void MustOverides(){}; }; template<typename AnyType> void CommonFunc(const AnyType& target) { // 呼ばれる } template<> void CommonFunc<AbstractClass>(const AbstractClass& target) { // 呼ばれない、呼ばせたい } void CommonFunc(AbstractClass& target) { // 呼ばれない、呼ばせたい } void CommonFunc(const AbstractClass& target) { // 呼ばれない、呼ばせたい } void main() { ChildClass Child; CommonFunc(Child); } よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
いろいろ調べてみたところ, 規格上は #include <type_traits> template <typename T> typename std::enable_if<! std::is_base_of<AbstractClass, T>::value>::type CommonFunc(T &target) { /* do something for anything but of derived class of AbstractClass */ } template <typename T> typename std::enable_if<std::is_bsae_of<AbstractClass, T>::value>::type CommonFunc(T &target) { /* do something for anything of derived class of AbstractClass */ } でいけるはず. VC は知らんけどとりあえず手元の GCC ではできた.
- Tacosan
- ベストアンサー率23% (3656/15482)
とりあえず, C++11 で <type_traits> の std::is_base_of が使えればそれなりなことはできそうだけど, ちょっと修正が必要な気がする.