我正在尝试提出一个容器包装器,它存储以下类型的数据:bool、int、double、std::string。此外,我有一个复杂的类型需要存储在容器中。让我们称之为Foo。为了简单起见,我们会说 Foo 包含一个整数列表。
我的容器类目前包装了我从 ac api 获得的丑陋而复杂的容器类型。当我完成对容器中数据的操作后,我需要将其复制回 api。它使用联合和链表。例如,我可以将这些数据复制到 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;
};
所以我使用了一个辅助设置器类来处理内存的细节。我有很多这样的课程,但 ISetter 会让您了解我在做什么。
为了处理 Foo 类型,它也是由 c api 以一种相当奇怪的方式存储的,我来到了下面的 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 的接口来处理。Setter2 实现处理我的 Foos 列表中的设置。下面缺少的 Setter1 处理丑陋的 c api 内存。
以下是这些类在实践中的想法:
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);
所以,我的问题是,如果您认为这是一个好方法,以及您可能会推荐哪些改进。
我使用共享指针而不是原始指针。