LINUX.ORG.RU

Получить в потомке аргумент темплейта, подставленный при наследовании родителя

 


0

4

Всем привет. Возможно слегка криво изъясняясь, хочу осуществить следующее:

template <typename T>
class A {};

class B: public A<ConcreteType> {};

class C: public B 
{
public:
	ConcreteType field;
};

Можно ли каким-либо образом «вытащить» тип ConreteType из цепочки наследования для B для переиспользования в C ?

★★★★★

Возможно криво тебя понял, но может ты хочешь так:

template <typename T>
class A {
public:
    typedef T value_type;
};

class B: public A<ConcreteType> {};

class C: public B 
{
public:
    value_type field;
};

pon4ik ★★★★★ ()
Последнее исправление: pon4ik (всего исправлений: 2)
Ответ на: комментарий от pon4ik

Нет, не то. Хочу каким-нибудь образом получить ConcreteType из объявления class B: public A<ConcreteType> в потомке класса B

jcd ★★★★★ ()
Ответ на: комментарий от jcd

Нет, не то. Хочу каким-нибудь образом получить ConcreteType из объявления class B: public A<ConcreteType> в потомке класса B

Это оно и есть, добавляешь одну строку (она не влияет ни на что при генерации объектника) и получаешь возможность узнать тип в потомке. В примере выше данный тип был использовать для объявления поля как пример.

anonymous ()

Если C++11 доступен и известен класс прародителя, то можно нечто такое соорудить:

#include <iostream>
#include <typeinfo>
#include <type_traits>

template <typename T>
class A {
public:
};

class B: public A<float> {};

template <template <typename> class Z>
struct X
{
    template <class T>
    T operator()(Z<T>);
};

class C: public B
{
public:
    std::result_of<X<A>(B)>::type field;

    C()
    {
        std::cout << typeid(field).name() << std::endl;
    }
};

int
main(int argc, char *argv[])
{
    C c;
    return 0;
}
Без этих двух условий будет проблематично, нельзя просто так переходить к родительским классам и получать параметры шаблонов. Поэтому в стандартной библиотеке много typedef внутри классов.

xaizek ★★★★★ ()
Ответ на: комментарий от jcd

Выдаёт Type 'value_type' could not be resolved при компиляции класса С

Значит ты где-то ошибся, проверяй. Пример точно рабочий, только что перепроверил.

Sectoid ★★★★★ ()
Ответ на: комментарий от Sectoid

Верно, проблема была в другом. Всё работает, всем спасибо.

jcd ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.