【问题标题】:C++ Generic Table Data StructureC++ 通用表数据结构
【发布时间】:2011-02-13 17:25:26
【问题描述】:

让我们有一堆桌子。表有列。每列都包含其类型的数据。我正在寻找一个通用表的结构,它允许我访问给定坐标处的元素并访问各个列。

我的想法是提供一个可以在儿童中实现的通用接口。孩子们会使用向量来存储各个列。我正在使用四张表,因此我可以为每张表设置一个对象。


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

问题显然在于“错误:模板可能不是‘虚拟’”。解决这个问题的最佳方法是什么?我想避免使用外部库。

彼得

【问题讨论】:

  • 表结构在编译时是否已知,或者您是否想要一个无需重新编译即可与任何表一起使用的解决方案?
  • 为什么函数需要是虚拟的?
  • @ronag:因为Data确实是一个接口。这些函数旨在在派生类中被覆盖。否则,抽象的非虚函数有什么用?
  • @jalf 好吧,一个通用的解决方案会很好,但我知道我的表的结构。
  • @Vlad:让我重新表述我的问题。为什么“数据”需要是一个接口?我不太明白你想做什么。

标签: c++ templates virtual generics


【解决方案1】:

制作类模板,如下所示:

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

这样你就可以让你的函数通用,同时也让编译器满意。

【讨论】:

  • 这实际上不是 OP 需要的,因为列数据可以有不同的类型,而在您的解决方案中它是相同的 T。
  • 这将编译,但我必须指定数据的类型。我需要使用通用数据对象。
  • @Petr:你尝试了一些在 C++ 中非法的东西。故事的结局。然后我给出了合法的东西。这就是故事的开始。我确定你想实现你的目标,从可能的事情开始,对吧?
  • 我发现经常从你想要的开始(无论在 C++ 中是否可行)是一种更有成效的工作方式。然后我只需要想办法诱使编译器做我想做的事。我发现它比从可能的东西开始更有用,但实际上并不能解决我的问题。 ;)
  • @jalf:但在某些时候,你必须从可能的开始,逐渐地做出改变,做一些技巧,以达到你的最终目标。在我看来,从不可能的事情开始永远不会有用。
【解决方案2】:

这是一个老问题,但对于仍在环顾四周的人来说:

您可以使用模板和现代 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

【讨论】:

    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2011-03-03
    • 2013-04-27
    • 1970-01-01
    相关资源
    最近更新 更多