c++ - 复杂类型的容器实现

标签 c++

我试图想出一个容器包装器来存储以下类型的数据:bool、int、double、std::string。此外,我有一个复杂的类型,我需要将其存储在容器中。我们称它为 Foo。为了简单起见,我们假设 Foo 包含一个整数列表。

我的容器类目前包装了一个丑陋而复杂的容器类型,它是我从 c api 获得的。当我完成对容器中数据的操作后,我需要将其复制回 api。它使用 union 和链表。我可以将这些数据复制到例如 std::list 中,但这可能会导致性能问题,这些问题会在以后出现。因此,我的容器类不依赖于数据在内存中的实际存储方式。

以下是我的容器外观的快速概念:

template <class T>
class Cont
{
public:
    Cont(ISetter<T>* setter)
        : _setter(setter)
    {
    }

    void sillyFunction(T t)
    {
        (*_setter)(t,0);
    }

private:
    ...
    ISetter<T>* _setter;
};

所以我使用了一个 helper setter 类来处理内存的细节。我有很多这样的类(class),但 ISetter 会让您了解我在做什么。

为了处理同样由 c api 以一种相当奇怪的方式存储的 Foo 类型,我使用了以下 setter。同样,这只是一个粗略的例子。

class IFoo
{
public:
    virtual int getMember() = 0;
};

class Foo2: public IFoo
{
public:
    virtual int getMember(){ return 1;} // dummy 
};

template<typename T> class ISetter{};
template<> class ISetter<IFoo*>
{
public:
    virtual void operator()(IFoo* value, int index) = 0;
};

template<typename T> class Setter{};
template<> class Setter2<Foo2*>: public ISetter<IFoo*>
{
public:
    virtual void operator()(IFoo* value, int index)
    {
        _list[index] = dynamic_cast<Foo2*>(value);
    }

private:
    std::vector<Foo2*> _list;
};

所以我将我的 Foo 作为一个名为 IFoo 的接口(interface)来处理。 Setter2 实现处理我的 Foos 列表在内存中的设置。下面缺少的 Setter1 处理难看的 c api 内存。

以下是这些类(class)的实践想法:

Foo2* f = new Foo2();
ISetter<IFoo*>* setter = new Setter2<Foo2*>();
Cont<IFoo*>* container = new Cont<IFoo*>(setter);
container->sillyFunction(f); 

例如,当处理整数时,我会做这样的事情:

int i = 10;
ISetter<int>* setter = new Setter1<int>();
Cont<int>* container = new Cont<int>(setter);
container->sillyFunction(i);

那么,我的问题是您是否认为这是一个好的方法,以及您可能会推荐哪些改进。

我使用共享指针而不是原始指针。

最佳答案

我会创建一个简单的 Foo 包装器类,它可以从 C API 中查找成员数据,并将其呈现为一个连贯的类。无需为此搞乱接口(interface)、虚函数或继承。只需一个类即可。

因此,对于 C API 中的每个“Foo”条目,您都创建了一个 Foo 包装器。

然后您将拥有简单、行为良好的类型,代表存储在您的 C 库中的数据的各个实例。

现在把它放在 std::vector 中。

struct Foo {
    Foo(<handle-or-pointer-to-library-data>);

    // member functions for retrieving member data from the C API
};


std::vector<int>
std::vector<bool>
std::vector<std::string>
std::vector<Foo>

据我了解您的问题,这将是一个简单而有效的解决方案。

关于c++ - 复杂类型的容器实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12350540/

相关文章:

c++ - 当我的类有静态成员时,为什么我的 C++ 程序不链接?

c++ - SFML C++ 绘制形状 vector

python - 如何获得指向通用 PyObject* 内数据的指针?

c++ - 如何优化 Knight 的游览算法?

c++ - VBO 不绘制任何东西

c++ - 返回 boost::shared_ptr 和从返回的原始指针构造 boost::shared_ptr 有什么区别?

c++ - 我怎样才能分离运算符(operator) [] 上的获取和设置访问权限?

c++ - 如何从 box2D 中的 Body* 获取 fixture 的 Shape 点?

c++ - 迭代 C++ 中的类继承

具有 20,000 个大小字符串的 C++ 堆栈溢出