我有一个具有以下要求的数据容器:
- 要快:因此是模板而不是正常的继承
- 使用不同的实现
- 能够使用更多方法扩展这些实现
- 数据是通过模板参数指定的,并且需要能够保存指向数据容器项的指针
我想出的解决方案如下:
template<typename T, template<typename> class container_t>
class data_c
{
public:
typedef data_c<T, container_t> value_type;
typedef typename container_t<value_type>::ref container_ref;
container_ref link;
T c;
};
template<typename T>
class storage_container_impl
{
public:
typedef T value_type;
typedef storage_container_impl<T>* ref;
T data;
};
template<typename _impl>
class storage_container : public _impl
{
public:
typedef typename _impl::value_type value_type;
typedef typename _impl::ref ref;
};
template<typename T>
using impl_storage_container = storage_container<storage_container_impl<T> >;
typedef impl_storage_container<data_c<int, impl_storage_container> > c_storage_container;
int main()
{
c_storage_container tmp;
tmp.data.c=5;
tmp.data.link=&tmp;
return tmp.data.c;
}
这导致以下错误(gcc 4.7):
test1.cpp:6:48: error: no type named 'ref' in 'impl_storage_container<data_c<int, impl_storage_container> > {aka class storage_container<storage_container_impl<data_c<int, impl_storage_container> > >}'
如果我使用T *data
而不是T data
(但我不想要那种间接),或者如果我不使用storage_container_impl
并且T data
直接在storage_container
. 使用storage_container_impl
mixin-style 也不能解决问题。作为container_ref
一个指针,也不应该有它不工作的原因,例如因为模板声明中有一个循环。这是问题的最小化版本。任何帮助,将不胜感激!