我现在正在努力实现标准,并且在规范中定义了模板类vector_class
。我只是使用别名模板
template <class T, class Allocator=std::allocator<T>>
using vector_class = std::vector<T, Allocator>;
在以后的工作中,我有一个函数调用vector_class::data()
,该函数返回一个类型为T*
的指针。
一切正常,除了T
是bool
之外。众所周知,对于类型std::vector<bool>
,std::vector
是bool
的一种节省空间的专业化方法,它没有实现成员函数data
,实际上我的机器上vector<bool>::data()
的返回类型为void
。现在是问题所在,我们有一些类似的代码:
template <class T>
class A {
public:
vector_class<T> buffer;
T* ptr; // this pointer is defined in the specification thus it is indispensable
A(T* data, size_t size) {
buffer.resize(size);
ptr = buffer.data();
std::copy(data, data + size, ptr);
}
};
如果T
是bool
,则编译器将引发错误,无法在代码void
中将类型bool*
转换为ptr = buffer.data()
。
好,对于我当前的实现,这是避免使用std::vector
的最后一个选择,但在Boost中是替代选择。我期望的是别名模板的部分专业化,但是不幸的是,根据C ++标准,它是不允许的。因此,我想问一下,是否还有其他方法可以解决此类问题?
答案 0 :(得分:2)
您可以对要与别名模板一起使用的代理类进行部分专业化处理:
template<typename T, typename Allocator> class
vector_class_impl final
{
public: using type = std::vector<T, Allocator>;
};
template<typename Allocator> class
vector_class_impl<bool, Allocator> final
{
public: using type = something_else<bool, Allocator>;
};
template <typename T, typename Allocator = std::allocator<T>>
using vector_class = typename vector_class_impl<T, Allocator>::type;
答案 1 :(得分:1)
这可能无济于事,因此您需要做更多的工作:
template <class T, class Allocator=std::allocator<T>>
struct vector_class: std::vector<T, Allocator>
{
using std::vector<T, Allocator>::vector;
// and member types too
};
template<class Allocator>
struct vector_class<bool, Allocator>
{
// recreate the whole vector interface here
};
答案 2 :(得分:0)
我认为您可以为class A
专门设计整个bool
模板,用boost::container::vector<T>
之类的东西来代替vector_bool<T>
。