无法使功能模板虚拟的解决方法?

时间:2010-06-23 14:56:45

标签: c++ templates abstract-class

我有一个抽象类顶点,代表一个n元组。顶点的元素可以是任何类型:即顶点的组件可以是int,int,float等类型。因为顶点可以有任意数量的维度,所以我想让类具有这样的组件设置器:

class vertex {
    public:
        template <class T>
        virtual void setComp(int componentnumber, T value) = 0;
};

当然,C ++不允许使用虚拟功能模板。那么:我该怎么做呢?我也不知道应该如何为顶点编写一个getter。

感谢。

5 个答案:

答案 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;模板)。