这是一个简单的问题,我相信它已经得到了回答,但我似乎无法找到一个好的答案。
我有一个班级,点:
template<class T>
Point{
\\code
}
...现在我想要一个点向量,其中一些有T作为整数,其中T为双精度。我想写点像
template<class T>
std::vector<Point<T> > points;
但是,唉,这不会编译错误“在'模板'之前预期的primary-expression'”。我无法使用此代码进行操作以使其正常工作。同样重要的是点在主类中,所以我不能将模板声明粘贴在函数之外。
如果有人可以指导我解决问题,我会非常感激。
感谢。
答案 0 :(得分:5)
如果您的目标是vector
同时包含Point<int>
和Point<double>
,则可以使用Boost Variant。
typedef boost::variant<Point<int>, Point<double> > VariantPoint;
然后:
std::vector<VariantPoint> my_vector;
my_vector.push_back(Point<int>(1, 0));
my_vector.push_back(Point<double>(1.5f, 2.0f));
会工作吗?请注意,要在之后检查元素,您可能必须使用记录为visitor pattern的here。
如果你的目标是拥有只能容纳一种Point
类型的不同矢量类型,那么你可以使用:
template<typename T> using PointVector = std::vector<Point<T>>; // C++11
// Now you can write:
PointVector<int> my_vector;
// Which is equivalent to:
std::vector<Point<int>> my_vector;
或者,如果C ++ 11不是一个选项:
template<typename T> struct PointVector
{
typedef std::vector<Point<T> > Type;
}
然后:
PointVector<int>::Type my_vector;
答案 1 :(得分:2)
要获得单一类型的向量,我会使用继承:
template <typename T>
struct PointVector : public std::vector< Point<T> >
{
};
注意,继承只是一种实现模板typedef等效的机制。这意味着,PointVector
不应包含任何数据成员或虚函数。但是,@ ereOn的建议是首选,并在this question的答案中进行了讨论。
实现变体的老式方法是使用联合。
class IntOrDouble {
union {
int i;
double d;
};
bool is_int;
bool is_double;
public:
IntOrDouble () : is_int(false), is_double(false) {}
IntOrDouble (int x) : is_int(true), is_double(false) { i = x; }
IntOrDouble (double x) : is_int(false), is_double(true) { d = x; }
int operator = (int x) {
is_int = true;
is_double = false;
return i = x;
};
double operator = (double x) {
is_int = false;
is_double = true;
return d = x;
};
operator int () const {
if (is_int) return i;
if (is_double) return d;
return 0;
}
operator double () const {
if (is_double) return d;
if (is_int) return i;
return 0;
}
};
typedef std::vector< Point<IntOrDouble> > PointVector;
但这个用例似乎有点过分了。我只是使用double的向量,除非内存真的紧。