我们有一堆表。表有列。每列保存同类数据。我正在寻找一个通用表的结构,它允许我访问给定坐标处的元素并访问各个列。
我的想法是提供一个可在儿童中实施的通用界面。孩子们会使用向量来存储单个列。我正在使用四个表,所以每个表都可以有一个对象。
class Data {
template < typename T >
virtual T getElement(unsigned int row, unsigned int column) const = 0;
template < typename T >
virtual void setElement(unsigned int row, unsigned int column, T value) = 0;
template < typename T >
virtual std::vector< T > getColumn(unsigned int column) const = 0;
template < typename T >
virtual void setColumn(unsigned int column, std::vector< T > values) = 0;
};
问题显然在“ 错误:模板可能不是'虚拟' ”。什么是解决这个问题的最佳方法?我想避免使用外部库。
彼得
答案 0 :(得分:2)
制作类模板,如下所示:
template<typename T>
class Data {
virtual T getElement(unsigned int row, unsigned int column) const = 0;
virtual void setElement(unsigned int row, unsigned int column, T value) = 0;
virtual std::vector< T > getColumn(unsigned int column) const = 0;
virtual void setColumn(unsigned int column, std::vector< T > values) = 0;
};
这样你就可以使你的函数变得通用,同时使编译器也很开心。
答案 1 :(得分:0)
这是一个老问题,但对于仍然环顾四周的人们来说:
您可以使用模板和现代C ++实现通用表。通过默认模板参数,您可以获得一个可用的表,但您也可以强力键入它。 std::any
允许我们在表格中混合使用类型。您可以使用此示例添加自己的API,但它可以按原样使用。
#include <any>
#include <map>
#include <iostream>
template<typename R = int, typename C = int, typename T = std::any>
class Table
{
public:
std::map<C, T>& operator[](R x)
{
return this->Data[x];
}
std::map<R, std::map<C, T>> Data;
};
int main()
{
Table t;
t[0][0] = std::string("foo");
t[0][1] = int(2112);
std::cout << std::any_cast<std::string&>(t[0][0]) << ", ";
std::cout << std::any_cast<int>(t[0][1]) << std::endl;
return 0;
}