c++ - 解决无法将函数模板虚拟化的问题?

标签 c++ templates abstract-class

我有一个代表 n 元组的抽象类顶点。顶点的元素可以是任何类型:即,顶点的组件可以是 int、int、float 或其他类型。因为顶点可以有任意数量的维度,我正在考虑让这个类有一个像这样的组件 setter :

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

当然,C++ 不允许虚函数模板。那么:我应该怎么做呢?我也不知道我应该如何为顶点编写 getter。

谢谢。

最佳答案

嗯,通常情况下,您应该将顶点类型作为模板参数,以便它可以正确存储:

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

关于c++ - 解决无法将函数模板虚拟化的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3102771/

相关文章:

c# - 嵌套接口(interface)和抽象实现类

java - Java 中的抽象类 - 创建方法

c++ - 我应该如何在 C++ 中将两个矩阵相乘?

c++ - 如何将 C++ 代码中的参数(argc、argv)传递到 MatLab Mex 文件中?

C++ 我怎样才能改进这个模板元程序来返回包含大小的数组?

c++ - 编译时是否需要短路评估规则?

c++ - dlib mlp::kernel_1a_c 类中的成员初始化

c++ - 如何在 C++ 中生成任意嵌套的 vector ?

c++ - 条件类型特征通用引用的问题

c# - 让构造函数从抽象类扩展到子类?