如何使用boost :: assign与扩展STL容器的自定义容器?

时间:2018-02-21 16:44:54

标签: c++ boost initialization

我需要做些什么来使自定义类(从std::vectorstd::map继承STL容器)与boost::assign list_of()或{{1}一起使用初始化函数?

背景

我想使用值列表轻松初始化容器。 C ++ 11引入了初始化列表但是我坚持 C ++ 03 所以我不能使用C ++ 11初始化列表

作为一种解决方法,我找到了boost:assign库,它提供了list_of()和map_list_of()等函数。这对于s​​td :: vector和std :: map等STL容器非常有效。但是,如果我通过例如创建自己的容器通过扩展std :: vector我得到编译错误。

实施例

这是一个小例子

map_list_of()

尝试编译该示例会给出以下错误:

#include "boost/assign/list_of.hpp"
using namespace boost::assign;
#include <vector>

struct SpecialVector : public std::vector<int>{
    foo(){/* adds functionality */}
};

int main(){
    std::vector<int> v = list_of(1)(2)(3); // list_of() works well for STL containers

    // The following works but requires adding items one-by-one with push_back
    SpecialVector u; 
    u.push_back(1);
    u.push_back(2);
    u.push_back(3);

    // The following fails when attempting to compile
    SpecialVector u2 = list_of(1)(2)(3);
}

我已经检查了boost :: assign库的文档。我找到了扩展库部分,但是如果我理解正确的话,本节将处理将自定义类添加为列表中的项,而不是生成初始化程序对于自定义类。或者我明白这个错了吗?

1 个答案:

答案 0 :(得分:2)

就像你说的那样,你需要允许从基类型构建:

<强> Live On Coliru

#include "boost/assign/list_of.hpp"
using namespace boost::assign;
#include <vector>

struct SpecialVector : std::vector<int>{
    typedef std::vector<int> base;
    void foo(){/* adds functionality */}

    SpecialVector() : base() {}
    template <typename T> explicit SpecialVector(T const& t) : base(t) {}
    template <typename T, typename U> SpecialVector(T const& t, U const& u) : base(t, u) {}
    template <typename T, typename U, typename V> SpecialVector(T const& t, U const& u, V const& v) : base(t, u, v) {}
};

int main(){
    std::vector<int> v = list_of(1)(2)(3); // list_of() works well for STL containers

    // The following works but requires adding items one-by-one with push_back
    SpecialVector u; 
    u.push_back(1);
    u.push_back(2);
    u.push_back(3);

    // The following fails when attempting to compile
    SpecialVector u2 = list_of(1)(2)(3);
}