Задача
Рассмотрим следующий класс
template <typename T>
struct A
{
T x;
};
Теперь, другой класс шаблонируется так:
template <typename T, typename U>
class B
{
protected:
std::vector<U> arr;
public:
T get_x(unsigned int p) { return arr[p].x; }
};
Я хотел бы получить доступ к полю A<T>::x
из B<T, A<T>>::get_x()
и вернуть его без изменений (т.е. сохранить его тип как T
). Мое плохое знание шаблонов говорит, что это требует знания типа andof T
, это должен быть один из параметров шаблона class B
. Однако это позволяет объявить что-то непоследовательное, например B<int, A<double>>
, и в целом звучит как ненужное повторение.
Вопросы
- Является ли то, что я написал, примером плохой практики программирования? Как это должно быть написано?
- Есть ли возможность вывести тип
T
из A<T>::x
и избежать двух типов шаблонов? Это похоже на повторение, поэтому я не уверен, есть ли там богобоязненное, стандартное решение или нет.
Для этого я использую GCC 4.6.2 с -std = c ++ 0x.