我需要做些什么来使自定义类(从std::vector
或std::map
继承STL容器)与boost::assign
list_of()
或{{1}一起使用初始化函数?
我想使用值列表轻松初始化容器。 C ++ 11引入了初始化列表但是我坚持 C ++ 03 所以我不能使用C ++ 11初始化列表。
作为一种解决方法,我找到了boost:assign库,它提供了list_of()和map_list_of()等函数。这对于std :: 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库的文档。我找到了扩展库部分,但是如果我理解正确的话,本节将处理将自定义类添加为列表中的项,而不是生成初始化程序对于自定义类。或者我明白这个错了吗?
答案 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);
}