开发者

C++ Generic Table Data Structure

开发者 https://www.devze.com 2023-02-10 01:20 出处:网络
Let\'s have a bunch of tables. Tables have columns. Each column hold data of its kind. I am looking for a structure for a generic table that would allow me to access elements at given coordinates and

Let's have a bunch of tables. Tables have columns. Each column hold data of its kind. I am looking for a structure for a generic table that would allow me to access elements at given coordinates and access individual columns.

My idea was to provide a common interface that would be implemented in children. Children would use vectors to store individual columns. There are like four tables I am working with, so I could have one object for each of them.


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;
};开发者_如何学运维

The problem is obviously in "error: templates may not be ‘virtual’". What would be the best way to attack this problem? I would like to avoid using external libraries.

Petr


Make the class template, like this:

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

This way you make your functions generic, simultaneously making the compiler happy as well.


This is an old question, but for folks still looking around:

You could implement a generic table using templates and modern C++. By defaulting the template arguments, you get a usable table, but you also get the ability to strongly type it. std::any allows us to mix types in the table as well. You can use this example to add your own API, but it is usable as-is.

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

Running version here: https://wandbox.org/permlink/WWYMppvweGNiW5Tm

0

精彩评论

暂无评论...
验证码 换一张
取 消