Как передать экземпляр шаблона в функцию, которая ожидает параметр шаблона, в базовый класс? - PullRequest
1 голос
/ 16 марта 2012

Я не уверен, как это объяснить, потому что я действительно не знаю правильных терминов, но вот пример:

template <typename T>
struct PointerWrapper {
    T *ptr;
};

struct Base {};

struct Derived : public Base {};

void test(PointerWrapper<Base>) {}

int main() {
    PointerWrapper<Derived> p;
    test(p);
    return 0;
}

Так как "Derived" является производным от "Base" иСтруктура "PointerWrapper" работает только с указателями на тип, указанный в шаблоне, в этом нет ничего плохого.Но компилятор жалуется:

asdfg.cpp:15:11: error: could not convert ‘p’ from ‘PointerWrapper<Derived>’ to ‘PointerWrapper<Base>’

Я даже пытался test(reinterpret_cast<PointerWrapper<Base>>(p)), но он говорит:

asdfg.cpp:15:51: error: invalid cast from type ‘PointerWrapper<Derived>’ to type ‘PointerWrapper<Base>’

Так что мне делать?

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Вы можете сделать это:

struct Base {};

struct Derived : Base {};

struct PointerWrapperBase {
    virtual Base* getBase() = 0;
};

template <typename T>
struct PointerWrapper : PointerWrapperBase {
    virtual Base* getBase() { return this->ptr; }
    T *ptr;
};

void test(PointerWrapperBase&) {}

int main() {
    PointerWrapper<Derived> p;
    test(p);
    return 0;
}
1 голос
/ 16 марта 2012

PointerWrapper<Base> и PointerWrapper<Derived> - совершенно разные типы, несмотря на связь между Base и Derived.

Если вы хотите разрешить передачу любого PointerWrapper<>, выполните:

template<typename T>
void test(PointerWrapper<T>)
{ }

Если вы хотите разрешить только PointerWrapper<T> случаи, когда T получено из Base, выполните:

template<typename T>
void test(
    PointerWrapper<T>,
    typename std::enable_if<std::is_base_of<Base, T>::value, void*>::type = 0
)
{ }

Если вы используете C ++ 03, замените std:: на boost:: и избавьтесь от ::value.

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