#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*>
приведет к странному результату, тогда как моя дальнейшая цель — проверить, может ли он быть приведен без каких-либо ошибок