Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;避免向量<;布尔>;实例化_C++_Templates_Vector_Stl - Fatal编程技术网

C++ c++;避免向量<;布尔>;实例化

C++ c++;避免向量<;布尔>;实例化,c++,templates,vector,stl,C++,Templates,Vector,Stl,我在std::vector上有一些类模板: template<typename T> class MyClass{ public: // public methods; private: std::vector<T> buffer_; // private methods and members }; 模板 类MyClass{ 公众: //公共方法; 私人: 向量缓冲区; //私有方法和成员 }; 这是我班级的简化版。内部vector此处用作排

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

template<typename T>
class MyClass{
public:
    // public methods;
private:
    std::vector<T> buffer_;
    // private methods and members
};
模板
类MyClass{
公众:
//公共方法;
私人:
向量缓冲区;
//私有方法和成员
};
这是我班级的简化版。内部
vector
此处用作排序的缓冲区,不同的IO操作,依赖于其单个内存块实现,如
fstreams
自定义缓冲区和仅在运行时已知的缓冲区大小。 一切正常,但是
vector
实例化绝对不适合这样的目的。我希望在我的类中使用
vector
vector
而不是
vector
实例化。此外,我不能使用额外的库,如boost,standart库只


有什么解决方法吗?

对T=bool类型使用模板专门化。 然后,对于除bool之外的所有类型,都使用向量

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

template <>
class MyClass<bool>
{
private:
    std::vector<char> buffer_;
};
模板
类MyClass
{
私人:
向量缓冲区;
};
模板
类MyClass
{
私人:
向量缓冲区;
};

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

使用如下包装子类:

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

template<>
struct sub_vector<bool>: public vector<char> {};
模板
结构子向量:公共向量{};
模板
结构子向量:公共向量{};

然后只需使用它而不是
vector

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

模板
结构向量值类型{
使用类型=T;
};
模板
结构向量值类型{
使用type=char;
};
模板
使用VectorValueType\u t=typename VectorValueType::type;
模板
类MyClass{
私人:
向量缓冲区;
};

所谓STL,你真的是指那个,对吗?@remyabel是的,我是。STL只是standart图书馆的一部分,你是right@vard为什么你相信你自己的专业化为<代码> STD::向量< /代码>可以做得更好,因为已经从C++标准库中得到了一个?他可能需要数据,emplace和emplace_back在向量专门化@πάντα中不可用,我只希望这种专门化中的每个bool在我的向量中跨越1个字节。嗯,由于部分专门化是不可能的,这可能会成为一项乏味的工作。向量就是这样做的,完全专门化。你只做相反的工作…Wtf与-1??这可能不是最好的答案,但仍然值得一个非负面的注意…在你第一次编辑后,我删除了我的否决票。最初你收到了3份,包括我的。通常情况下,被否决的投票者不会审查他们被否决的问题。在这两个
>
之间需要一个空格。嗯,为
bool
模板参数放置的
向量上的按位操作需要特殊处理,这是如何区分的,选择用于实例化模板代码?@galinette不用于当前标准。你说得对,我总是忘记这一点。但是作者没有指定我使用c++11标准,没关系。当你费尽心机地包装
vector
,你可能想用正确的类型重新定义函数。此外,如果进行了自定义,您可能希望转发分配器。
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_;
};