+ =在没有增强的矢量上

小太郎*_*小太郎 2 c++ boost stl vector operator-overloading

有没有办法在不使用boost或使用派生类的情况下将+ =运算符与向量一起使用?

例如.

somevector += 1, 2, 3, 4, 5, 6, 7;
Run Code Online (Sandbox Code Playgroud)

实际上是

somevector.push_back(1);
somevector.push_back(2);
somevector.push_back(3);
etc.
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 14

有点丑陋的运算符重载,这不是很难实现.这个解决方案可以很容易地变得更通用,但它应该作为一个适当的例子.

#include <vector>
Run Code Online (Sandbox Code Playgroud)

您需要的语法使用两个运算符:+=运算符和,运算符.首先,我们需要创建一个包装类,允许我们应用,运算符将元素推送到向量的背面:

template <typename T>
struct push_back_wrapper
{
    explicit push_back_wrapper(std::vector<T>& v) : v_(&v) { }

    push_back_wrapper& operator,(const T& x)
    {
        v_->push_back(x);
        return *this;
    }

    std::vector<T>* v_;
};
Run Code Online (Sandbox Code Playgroud)

然后,为了在+=向量上结合使用它,我们+=为向量重载运算符.我们返回一个push_back_wrapper实例,以便我们可以使用逗号运算符链接回推:

template <typename T, typename U>
push_back_wrapper<T> operator+=(std::vector<T>& v, const U& x)
{
    v.push_back(x);
    return push_back_wrapper<T>(v);
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以编写您的示例中的代码:

int main()
{
    std::vector<int> v;
    v += 1, 2, 3, 4, 5, 6, 7;
}
Run Code Online (Sandbox Code Playgroud)

v += 1会调用我们的operator+=过载,将返回的一个实例push_back_wrapper.然后,为"列表"中的每个后续元素应用逗号运算符.

  • @ kotarou3:如果我们对两个参数都使用`T`,那么如果我们试图做`vector <int> v,那么模板的实例化就会失败; v + = 3.0;`,因为`+ =`的第一个参数是`vector <int>`类型,所以`T`必须是`int`,但第二个参数是`double,'所以`T`必须是'double`.它不可能两者兼而有之.通过使用第二个类型参数,我们可以允许隐式转换按照我们的预期进行.它不是`,`重载的问题,因为`,`重载本身不是一个函数模板,它是类模板的成员函数. (3认同)
  • 哦,所以逗号也是一个超载的提升?OO (2认同)
  • 是的,这正是提升正在做的事情.这有点滥用`,`运算符,因为这不是逗号运算符通常所做的,但它是完全合法的C++.C++语法可以做很奇怪的事情:http://www.xs4all.nl/~weegen/eelis/analogliterals.xhtml (2认同)

Tyl*_*nry 5

不是这样的语法,不.但你可以这样做:

int tmparray[] = {1, 2, 3, 4, 5, 6, 7};

somevector.insert(somevector.end(), 
                  tmparray, 
                  tmparray + (sizeof(tmparray) / sizeof(tmparray[0])));
Run Code Online (Sandbox Code Playgroud)