避免别名模板部分专业化的最佳实践

时间:2018-08-11 05:47:07

标签: c++ templates vector stl

我现在正在努力实现标准,并且在规范中定义了模板类vector_class。我只是使用别名模板

template <class T, class Allocator=std::allocator<T>>
using vector_class = std::vector<T, Allocator>;

在以后的工作中,我有一个函数调用vector_class::data(),该函数返回一个类型为T*的指针。

一切正常,除了Tbool之外。众所周知,对于类型std::vector<bool>std::vectorbool的一种节省空间的专业化方法,它没有实现成员函数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);
    }
};

如果Tbool,则编译器将引发错误,无法在代码void中将类型bool*转换为ptr = buffer.data()

好,对于我当前的实现,这是避免使用std::vector的最后一个选择,但在Boost中是替代选择。我期望的是别名模板的部分专业化,但是不幸的是,根据C ++标准,它是不允许的。因此,我想问一下,是否还有其他方法可以解决此类问题?

3 个答案:

答案 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>