3

这是一个简单的问题,我确信之前已经回答过,但我似乎找不到一个好的答案。

我有一堂课,点:

template<class T>
Point{
\\code
}

...现在我想要一个点向量,其中一些将 T 作为整数,而将 T 作为双精度数。我想写类似的东西

template<class T>
std::vector<Point<T> > points;

但是,唉,这不会与错误“'template'之前的预期主表达式”一起编译。我无法对这段代码坐立不安以使其工作。同样相关的是点在主类中,所以我不能将模板声明粘贴在函数之外。

如果有人可以指导我找到解决方案,我将非常感激。

谢谢。

4

2 回答 2

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));

将工作。请注意,要在之后检查元素,您可能必须使用此处记录的访问者模式

如果您的目标是拥有只能包含一种类型的不同向量类型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;
于 2012-06-12T07:18:13.563 回答
2

要获得一种向量,我会使用继承:

template <typename T>
struct PointVector : public std::vector< Point<T> >
{
};

注意,继承只是实现模板 typedef 等价的一种机制。这意味着,PointVector不应包含任何数据成员或虚函数。但是,@ereOn 的建议是首选,并在此问题的答案中进行了讨论。

实现变体的老式方法是使用联合。

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;

But it all seems a little over the top for this use case. I'd just use vectors of double all around, unless memory was really tight.

于 2012-06-12T07:36:48.993 回答