C dynamic_cast класс шаблона в другой шаблон

#c

#c

Вопрос:

Я работаю с шаблонным классом A<widget_type> и хочу знать, возможно ли это dynamic_cast<A<another_type>*>(A<widget_type>*) . Вопрос: в следующем коде A<B>* target2 = dynamic_cast<A<B>*>(amp;source); возвращает нулевой указатель. Можно ли привести шаблонный класс в тот же класс, но с другим шаблоном? Редактировать: я должен создать программу, в которой массив содержит A<B*> объекты, но A<B*> объекты могут поступать из A<C*> или A<D*> . Мне нужно проверить во время выполнения A<B*> , может ли объект быть приведен к нужному шаблонному классу. По этой причине я не могу использовать строгую типизацию, поскольку A<B*> object может исходить из A<E*> object , где E есть класс, который могут создавать другие люди, и, следовательно, в этом классе шаблона может не быть функции преобразования. Код:

 template<typename widget_type>
class A
{
public:
    std::vector<widget_type*> value;

    virtual ~A() {}

    void Add(widget_type* val)
    {
        value.push_back(val);
    }
    template<typename return_type>
    operator A<return_type>()
    {
        unsigned int size = this->value.size();
        std::vector<return_type*> return_value;
        return_value.resize(size);
        for (unsigned int i = 0; i < size; i  )
        {
            return_value[i] = dynamic_cast<return_type*>(this->value[i]);
        }
        A<return_type> target;
        target.value = return_value;
        return target;
    }
};

class B
{
public:
    virtual ~B() {}
};

class C : public B
{
public:
    void Print()
    {
        std::cout << "C CALLn";
    }
};

class D : public B
{

};

int main()
{
    std::cout << "Start!n";
    A<C> source;
    C* val1 = new C;
    source.Add(val1);
    A<B> target = source;
    A<B>* target2 = dynamic_cast<A<B>*>(amp;source);
    if (target2)
    {
        std::cout << "POINTERn"; 
    }
    std::cout << "ENDn";
}```
 

Комментарии:

1. Какой-то template_cast ? Не напрямую, но, я думаю, вы могли бы написать функцию преобразования.

2. Даже динамическое приведение в шаблонной функции-члене вывода вызывает сомнения. Лучше реализовать надлежащие функции преобразования. Строгая типизация существует не просто так.

Ответ №1:

dynamic_cast будет успешным только в том случае, если существует какое-то отношение наследования между тем, откуда вы пришли, и тем, куда вы направляетесь.

Если вы просто хотите обработать указатель одного типа как указатель на другой тип (что в общем случае верно для разных специализаций одного и того же шаблона), то dynamic_cast не будет успешным. Только c-style или reinterpret_cast разрешит приведение, но даже тогда результаты не определены.

Комментарии:

1. Приведение в стиле C всегда что-то возвращает? Я хочу проверить A<widget_type*> , можно ли безопасно вставить в другой шаблон. Насколько я знаю, при A<C*> изменении его с помощью C-style на A<D*> приведет к странному результату, тогда как моя дальнейшая цель — проверить, может ли он быть приведен без каких-либо ошибок