【问题标题】:c++ avoid vector<bool> instantiationc++ 避免向量<bool> 实例化
【发布时间】:2014-12-10 22:51:28
【问题描述】:

我在 std::vector 上有一些类模板:

template<typename T>
class MyClass{
public:
    // public methods;
private:
    std::vector<T> buffer_;
    // private methods and members
};

这是我的课程的简化版本。内部vector在这里用作排序缓冲区,不同的IO操作,依赖于它的单个内存块实现,例如fstreams自定义缓冲区和缓冲区大小仅在运行时知道。 一切都好,但vector&lt;bool&gt; 实例化绝对不适合这样的目的。我想在我的班级中有vector&lt;char&gt;vector&lt;uint8_t&gt; 而不是vector&lt;bool&gt; 实例化。我也不能使用其他库,如 boost、标准库。

有什么解决办法吗?

【问题讨论】:

  • STL 的意思是c++-standard-library,对吧?
  • @remyabel 是的,我是。 STL 只是标准库的一部分,你是对的
  • @vard 为什么你认为你自己的 std::vector&lt;bool&gt; 专业化可以做得更好,因为它已经可以从 c++ 标准库中获得?
  • 他可能需要vector专业化中没有的数据、emplace和emplace_back
  • @πάντα 我只希望这种专业化中的每个 bool 在我的向量中跨越 1 个字节。

标签: c++ templates vector stl


【解决方案1】:

创建一个帮助类来确定向量的值类型(此代码使用 C++11,但仅使用 C++98 即可轻松重写):

template<typename T>
struct VectorValueType {
    using type = T;
};

template<>
struct VectorValueType<bool> {
    using type = char;
};

template<typename T>
using VectorValueType_t = typename VectorValueType<T>::type;

template<typename T>
class MyClass{
private:
    std::vector<VectorValueType_t<T>> buffer_;
};

【讨论】:

  • 两个&gt; &gt;之间需要一个空格@
  • 好吧,vector&lt;char&gt; 上的按位运算是为bool 模板参数放置的,需要特殊处理,如何区分,选择用于实例化的模板代码?
  • @galinette 不适用于当前标准。
  • 你说得对,我总是忘记这一点。但是作者没有具体说明
  • 我用的是c++11标准,没问题。
【解决方案2】:

像这样使用包装器子类:

template<typename T>
struct sub_vector: public vector<T> {};

template<>
struct sub_vector<bool>: public vector<char> {};

然后就用它代替vector

【讨论】:

  • 当您费尽心思包装vector 时,您可能想用正确的类型重新定义函数。此外,如果自定义,您可能希望转发分配器。
【解决方案3】:

对 T=bool 类型使用模板特化。 那么对于除bool以外的所有类型,都使用vector。

template <typename T>
class MyClass
{
private:
    std::vector<T> buffer_;
};

template <>
class MyClass<bool>
{
private:
    std::vector<char> buffer_;
};

您还需要专门化您将添加的每个成员函数。

【讨论】:

  • 嗯,由于不可能进行部分专业化,这可能会成为一项乏味的工作。
  • vector 就是这样完成的,具有完全的专业化。你只做相反的工作......
  • Wtf 与 -1??这可能不是最好的答案,但仍然值得一个非否定的说明......
  • 在您第一次编辑后,我删除了我的反对意见。最初你收到了 3 个,包括我的。投反对票的人通常不会审查他们投反对票的问题。
猜你喜欢
  • 2014-10-01
  • 2015-04-15
  • 1970-01-01
  • 2017-03-11
  • 2012-07-16
  • 1970-01-01
  • 2019-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多