小太郎*_*小太郎 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.然后,为"列表"中的每个后续元素应用逗号运算符.
不是这样的语法,不.但你可以这样做:
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)
| 归档时间: |
|
| 查看次数: |
386 次 |
| 最近记录: |