0

クラスにテンプレート メンバーがあり、このメンバーのクラスが特定のクラスから継承されているかどうかを知りたいです。

class BaseClass;  
template <typename T>  
class MyClass  
{  
    T* my_member;  
public:  
    void function()  
    {  
        BaseClass * base = dynamic_cast<BaseClass*>(my_member)  
        if(base != 0)
        {
            // DO SOMETHING
        }
        else
        {
            // DO SOMETHING ELSE
        }
    }  
};

のクラスがポリモーフィックでない場合、dynamic_cast がコンパイルされないことはわかっていますがmy_member、テンプレート クラスを制御することはできません。 )。
T がポリモーフィックであるかどうかにかかわらず、コンパイルできるようにこれを実装するというアイデアはありませんか? アイデアをありがとう

4

2 に答える 2

0

is_polymorphic Boost タイプの特性は、あなたが探しているものだと思います。タスクにより適した型特性がある場合は、他の型特性も確認することをお勧めします。ただし、それらの多くは実装されていないことに注意してください。常にドキュメントを確認してください。

于 2011-06-30T22:42:29.117 に答える
0

私はこの質問が古いことを知っていますが、タイプ T が不明なジェネリック クラス (ライブラリの使用) があるという同じ問題に遭遇しており、その結果、T はポリモーフィックである場合とそうでない場合がありますがdynamic_cast、実装するために使用する必要があります。いくつかの動作。

これが最善の解決策かどうかはわかりませんが、SFINAE ( https://en.cppreference.com/w/cpp/language/sfinae )を使用して、T に基づいて異なる方法でコンパイルする「一般的な」動的キャストを作成できました。

template<typename U>
class Cast
{
public:
  template<typename T>
  static inline U dynamic(T *iPtr, typename std::enable_if<!std::is_polymorphic<T>::value>::type * = nullptr)
  {
    return nullptr;
  }

  template<typename T>
  static inline U dynamic(T *iPtr, typename std::enable_if<std::is_polymorphic<T>::value>::type * = nullptr)
  {
    return dynamic_cast<U>(iPtr);
  }
};

したがって、特定の例では、次のようになります

void function()  
{  
    BaseClass * base = Cast<BaseClass *>::dynamic(my_member);  
    if(base != 0)
    {
        // DO SOMETHING
    }
    else
    {
        // DO SOMETHING ELSE
    }
}  
于 2018-11-17T17:22:27.390 に答える