我有一个抽象类顶点,代表一个n元组。顶点的元素可以是任何类型:即顶点的组件可以是int,int,float等类型。因为顶点可以有任意数量的维度,所以我想让类具有这样的组件设置器:
class vertex {
public:
template <class T>
virtual void setComp(int componentnumber, T value) = 0;
};
当然,C ++不允许使用虚拟功能模板。那么:我该怎么做呢?我也不知道应该如何为顶点编写一个getter。
感谢。
答案 0 :(得分:2)
通常,您应该将顶点类型作为模板参数,以便正确存储:
template<typename T, size_t NumAxes = 3>
class vertex {
private:
T comp[NumAxes];
};
在这种情况下,不需要虚拟方法,因为你可以只使用C ++的类型转换来完成工作:
template<typename T, size_t NumAxes = 3>
class vertex {
public:
template <typename U>
void setComp(size_t index, U value) { comp[index] = static_cast<T>(value); }
private:
T comp[NumAxes];
};
现在,如果您希望它是虚拟的,因为您希望子类能够处理事情(例如记录值的每个更改),您需要定义一个非模板化的函数:
template<typename T, size_t NumAxes = 3>
class vertex {
public:
template <typename U>
void setComp(size_t index, U value)
{ _setComp(index, static_cast<T>(value)); }
protected:
T comp[NumAxes];
virtual void _setComp(size_t index, T value)
{ comp[index] = value; }
};
template<typename T, size_t NumAxes = 3>
class logged_vertex: public vertex<T, NumAxes> {
protected:
virtual void _setComp(size_t index, T value);
};
template<typename T, size_t NumAxes = 3>
void logged_vertex<T, NumAxes>::_setComp(size_t index, T value)
{ cout << "Index " << index << " changed from " << comp[index];
vertex<T, NumAxes>::_setComp(index, value);
cout << " to " << comp[index] << endl;
}
答案 1 :(得分:0)
这是一个非常奇怪的OO和泛型编程组合。我想你应该选择其中一个。
使顶点类成为模板或为'value'参数定义基类并派生自定义类型处理程序类。
答案 2 :(得分:0)
使用多态而不是模板。
或限制您想要传递的类型,并进行重载。并增加维护成本。
实现这些解决方案将涉及boost :: any或boost :: variant以节省一些时间。
答案 3 :(得分:0)
Because the vertex can have an arbitrary number of dimensions
- 不能成为
template<size_t N> class vector {
private:
boost::any elems[N];
}
然后避免通过模板混合运行时多态和编译时多态?如果数量有限,可以使用任何可能类型的函数重载。
virtual void setComp(int, float) = 0;
virtual void setComp(int, bool) = 0;
答案 4 :(得分:0)
首先,我会问自己是否真的需要在运行时以多态方式访问顶点对象。例如,如果您需要能够拥有不同类型(double,int等)的顶点*对象列表,并以多态方式访问它们。
听起来像顶点是编译时多态的典型情况(即template <typename CoordinateType> class vertex;
模板)。