#c #c 11 #templates
Вопрос:
Существует следующая упрощенная структура данных:
Объект 1.h
template <class T>
class Object1
{
private:
T a1;
T a2;
public:
T getA1() {return a1;}
};
Объект 2.h
template <class T>
class Object2: public Object1 <T>
{
private:
T b1;
T b2;
public:
T getB1() {return b1;}
}
Есть ли какой-либо способ получить тип T объекта в следующей функции:
Функции.h
template <class Object>
void (Object *o1, Object *o2)
{
T = o1.getA1(); //Is it possible to get T from object o1?
...
}
или мы должны предоставить дополнительную информацию о типах данных обоих объектов:
template <class T, class Object>
void (Object *o1, Object *o2)
{
T = o1.getA1();
...
}
Комментарии:
1. Это будет возможно в C 0x.
Ответ №1:
Добавьте typedef :
template <class T>
class Object1
{
private:
T a1;
T a2;
public:
T getA1() {return a1;}
typedef T type;
};
template <class Object>
void foo(Object *o1, Object *o2)
{
typename Object::type x = o1.getA1();
...
}
Комментарии:
1. Похоже, что когда шаблон «создан?» для типа T, не могли бы вы просто написать
T x = o1...
. Я не понимаю, зачем вам нужно набирать def, когда T уже является типом…2. 1 для typedef, но ИМХО он должен быть назван
a1_type
, а не простоtype
.
Ответ №2:
Вы можете использовать это:
template <template<class> class Object, class T>
void func1(Object<T> amp;o1, Object<T> amp;o2)
{
T x = o1.getA1();
}
Рабочий пример на http://www.ideone.com/t8KON .
Кстати, если вы используете указатели в качестве параметров, вы должны использовать ->
оператор для вызова методов.