проверка преобразования приведения (как dynamic_cast) класса Template, который может быть не полиморфным - PullRequest
0 голосов
/ 28 июня 2011

У меня есть член шаблона в моем классе, и я хотел бы знать, наследует ли класс этого члена от определенного класса.

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 полиморфным или нет? Спасибо за любые идеи

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Я знаю, что этот вопрос старый, но я сталкивался с той же проблемой, когда у меня есть универсальный класс, тип T которого неизвестен (использование библиотеки), и в результате T может быть или не быть полиморфным, но мне нужно используйте dynamic_cast для реализации некоторого поведения.

Я не уверен, что это лучшее решение, но мне удалось написать «универсальное» динамическое приведение, которое компилируется по-разному на основе T с использованием SFINAE (https://en.cppreference.com/w/cpp/language/sfinae)

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
    }
}  
0 голосов
/ 01 июля 2011

Я считаю, что черта типа is_polymorphic Boost - это то, что вы ищете.Возможно, вы захотите взглянуть на другие черты типа , а также, если есть одна, лучше подходящая для этой задачи.Однако будьте осторожны, многие из них не реализованы, всегда проверяйте документацию.

...