Любой способ использовать метод в классе шаблона (если у вас есть указатель на базовый класс), когда вы не знаете тип используемого шаблона - PullRequest
1 голос
/ 02 декабря 2010

Допустим, у меня есть это:

class A 
{
    virtual int Method2(){/*...*/}
};

template<typename T>
class B<T> : public A
{
public :
    virtual int Method1(){/*...*/}
    virtual int Method2(){/*...*/}
};

Возможно ли сделать что-то подобное (конечно, это не работает ...)?

A* a = ...;

B* b = dynamic_cast<B*>(a);

b->Method1();

Спасибо

Ответы [ 5 ]

2 голосов
/ 02 декабря 2010

Люди обычно имеют промежуточный класс.

class A { virtual ~A() {} };
class B : public A { virtual void method(); }
template<typename T> class C : public B {
    void method() { ... }
};

A* a = new C<int>();
if(B* b = dynamic_cast<B>(a)) {
    b->method();
}

Это называется стиранием типов.Однако в этой системе А на самом деле не имеет большого значения.

1 голос
/ 02 декабря 2010

Предполагая, что вы имели в виду:

template<typename T>
class B { and the rest of it }

Тогда B не является классом, поэтому такого понятия, как B*, не существует.Если ваш код не находится внутри шаблона класса B, то есть в этом случае B относится к тому, что посторонние называют B<T> для некоторого типа T.

Содержимое ... также очень важно.Это нормально:

A *a = new B<int>();
B<int> *b = static_cast<B<int>*>(a);
b->Method1();

Наконец, вы можете только dynamic_cast, если у классов есть виртуальные функции, которых в вашем примере нет.

0 голосов
/ 02 декабря 2010

B должен иметь полный тип, то есть B . Тогда вы можете сделать это как с обычным классом, но вы не можете сделать это только с классом без параметра типа.

0 голосов
/ 02 декабря 2010

Нет, потому что B не полный тип. Вы не можете получить указатель на B, потому что нет такой вещи как B.

Похоже, вы пытаетесь использовать шаблоны для достижения полиморфизма во время выполнения. Это верно?

0 голосов
/ 02 декабря 2010
class A 
{
    //...
};

template <class T>  //you missed this line
class B : public A  //note the public keyword
{
public :
    int Method1(){/*...*/}
};

Теперь вы можете использовать

A* a = new B<char>;

B<char>* b = dynamic_cast<B<char>*>(a);

b->Method1();

Обратите внимание, что B - это не класс, это шаблон класса.Поэтому вам необходимо предоставить аргументы шаблона

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...