将ASSIGN语法提升为重载+ =以初始化向量并添加值

时间:2017-11-20 19:05:29

标签: c++ boost

#include <iostream>
#include<vector>
using namespace std;

template <class T> class vector_inserter{
public:
    std::vector<T> v;
    vector_inserter(std::vector<T>& v):v(v){}
    vector_inserter& operator,(const T& val){v.push_back(val);return *this;}
};
template <class T> vector_inserter<T> operator+=(std::vector<T>& v,const T& x)
{
    return vector_inserter<T>(v),x;
}

int main()
{
vector_inserter<int> t+=1,2,3,

}

我在堆栈溢出时遇到了这个代码,我仍然试图理解它是如何工作的,我尝试编译上面的代码但是我得到错误,因为预期的初始化程序是+ =

有没有什么好方法可以为{},(),+ =等向量操作重载运算符?

1 个答案:

答案 0 :(得分:0)

Boost Assign是Boost的少数部分之一,我认为它几乎已经过时(参见Which Boost features overlap with C++11?

首先,这里修复了一个(更多)更通用的代码版本:

<强> Live On Coliru

#include <iostream>
#include <vector>
#include <list>
#include <map>

template <class C> struct inserter {
    C& c;
    template <typename T>
    inserter& operator,(const T& val){ c.insert(c.end(), val); return *this; }
};

template <typename C, typename V = typename C::value_type> inserter<C> operator+=(C& c, const V& x) {
    return inserter<C>{c}, x;
}

int main()
{
    std::vector<int> t;
    t += 1,2,3;

    std::list<int> l;
    l += 1,2,3;

    std::map<int, std::string> m;
    m += std::make_pair(1, "one"), std::make_pair(2, "two"), std::make_pair(3, "three");
}

请注意它是如何适用于其他类型的。

以下是您在/ just / c ++ 11中编写类似内容的方式:

std::vector<int> t {4,5,6};
t.insert(t.end(), {1,2,3});
t.assign({1,2,3});