Общая структура данных C ++ - PullRequest
       7

Общая структура данных C ++

2 голосов
/ 13 февраля 2011

Давайте иметь несколько таблиц.Таблицы имеют столбцы.Каждый столбец содержит данные своего вида.Я ищу структуру для универсальной таблицы, которая позволила бы мне получить доступ к элементам с заданными координатами и получить доступ к отдельным столбцам.

Моя идея состояла в том, чтобы предоставить общий интерфейс, который будет реализован в дочерних элементах.Дети будут использовать векторы для хранения отдельных столбцов.Я работаю с четырьмя таблицами, поэтому у меня может быть по одному объекту для каждой из них.


class Data {
    template &lt typename T &gt
    virtual T getElement(unsigned int row, unsigned int column) const = 0;

    template &lt typename T &gt
    virtual void setElement(unsigned int row, unsigned int column, T value) = 0;

    template &lt typename T &gt
    virtual std::vector&lt T &gt getColumn(unsigned int column) const = 0;

    template &lt typename T &gt
    virtual void setColumn(unsigned int column, std::vector&lt T &gt values) = 0;
};

Проблема, очевидно, в ошибке ": шаблоны могут не быть" виртуальными "«».Как лучше всего решить эту проблему?Я хотел бы избежать использования внешних библиотек.

Petr

Ответы [ 2 ]

2 голосов
/ 13 февраля 2011

Сделайте шаблон класса следующим образом:

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

Таким образом, вы сделаете свои функции универсальными, одновременно сделав компилятор счастливым.

0 голосов
/ 11 апреля 2018

Это старый вопрос, но для тех, кто все еще оглядывается:

Вы можете реализовать универсальную таблицу, используя шаблоны и современный 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;
}

Текущая версия здесь: https://wandbox.org/permlink/WWYMppvweGNiW5Tm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...