考虑以下课程
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
)。我对模板的了解不足说,这需要知道T
的类型和class B
应该是B<int, A<double>>
的模板参数之一。但是,这使得可以声明一些不一致的内容,例如T
,并且通常听起来像是不必要的重复。
A<T>::x
的类型{{1}}并避免使用两种模板类型?这感觉就像是重复,所以我不确定是否有一个敬畏上帝,标准持久的解决方案。对于它的价值,我使用GCC 4.6.2和-std = c ++ 0x。
答案 0 :(得分:4)
我建议采用标准库采用的方法。定义嵌套类型。
template <typename T>
struct A
{
typedef T value_type; //this is nested type to be used by B
T x;
};
//this is another class added by me, just to demonstrate the genericity
template <typename T>
struct C
{
typedef T value_type; //this is nested type to be used by B
T x;
};
template <typename T>
class B
{
typedef typename T::value_type value_type; //get the nested type
protected:
std::vector<T> arr;
public:
value_type get_x(unsigned int p) { return arr[p].x; }
//^^^^^^^^^ note this
};
用法:
B<A<int>> ba; //'>>' if C++11, otherwise use '> >' (separate them by space)
B<C<double>> bc; //works for C class template as well