模板的简单示例

时间:2012-06-12 07:08:37

标签: c++ templates

这是一个简单的问题,我相信它已经得到了回答,但我似乎无法找到一个好的答案。

我有一个班级,点:

template<class T>
Point{
\\code
}

...现在我想要一个点向量,其中一些有T作为整数,其中T为双精度。我想写点像

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

但是,唉,这不会编译错误“在'模板'之前预期的primary-expression'”。我无法使用此代码进行操作以使其正常工作。同样重要的是点在主类中,所以我不能将模板声明粘贴在函数之外。

如果有人可以指导我解决问题,我会非常感激。

感谢。

2 个答案:

答案 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 patternhere

如果你的目标是拥有只能容纳一种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的向量,除非内存真的紧。