Получить тип параметра, шаблоны, C

#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 .

Кстати, если вы используете указатели в качестве параметров, вы должны использовать -> оператор для вызова методов.