C++ 添加运算符<&书信电报;到std::vector

C++ 添加运算符<&书信电报;到std::vector,c++,vector,C++,Vector,我想添加操作符恐怕这是不可能的。对于任何标准库类,重载运算符也是一个坏主意。STL不能扩展。您不能。唯一可以实现的方法是,如果操作符是向量的成员。(由于某些原因,可以在临时表上调用成员函数) 作为一个非成员函数,尽管你所追求的是不可能的 另外,对STL类型(如std::vector)重载运算符也不是一个好主意。我想你们想要完成的已经存在于图书馆里了。我不相信你能写得比他们更好,所以如果你需要的话,最好使用boost。我还没有真正考虑过这会带来什么后果,但似乎你可能会有一个右值过载: std::v

我想添加
操作符恐怕这是不可能的。对于任何标准库类,重载运算符也是一个坏主意。STL不能扩展。

您不能。唯一可以实现的方法是,如果操作符是向量的成员。(由于某些原因,可以在临时表上调用成员函数)

作为一个非成员函数,尽管你所追求的是不可能的


另外,对STL类型(如std::vector)重载运算符也不是一个好主意。我想你们想要完成的已经存在于图书馆里了。我不相信你能写得比他们更好,所以如果你需要的话,最好使用boost。

我还没有真正考虑过这会带来什么后果,但似乎你可能会有一个右值过载:

std::vector<std::string> operator<<(std::vector<std::string>&& op, std::string str) {
  op.push_back(std::move(str));
  return op;
}

std::vector操作符那么。。。从技术上讲,这是可行的,但风格肮脏。只是为了举例说明(我不太确定它是否值得真正实现)。检查是否符合GCC 4.7.2的要求。我真的不知道它在常量对象上的行为

#include <vector>
#include <string>
#include <iostream>

const std::vector<std::string>& operator << (const std::vector<std::string>& op, const std::string &str) 
{
    ((std::vector<std::string>&) op).push_back(str);
    return op;
}

int main()
{
    std::vector<std::string> a = std::vector<std::string>() << "A" << "B";
    a << "AAA";

    std::cout << "size: " << a.size() << std::endl;
    for (std::vector<std::string>::iterator i = a.begin(); i != a.end(); ++i)
    {
        std::cout << '\t' << *i << std::endl;
    }

    return 0;
}
#包括
#包括
#包括

const std::vector&operator这是一段代码,可以帮助您执行类似于您的想法()的操作:

#包括
#包括
typedef std::string字符串;
typedef std::vector StringVector;
类StringVectorWrapper{
字符串向量;
公众:
运算符StringVector&(){
返回向量;
}

StringVectorWrapper&operator这方面的用例是什么?为什么需要这样做?我认为提问者计划做
takesConstRef(std::vector())@sftrabbit是的,读最后一句你可以做的。不是无用的,它们提供了一个完全合理的用例。不过我可能同意不可能。对于boost-assign,它看起来是最好的解决方案。为什么有几个答案说这是不可能的?@moing-Duck:你可以试着帮助,我已经尝试过了,尽管警告说这不是如此清晰的解决方案(但有效答案),从一些认为自己(也许是吧?)非常聪明的白痴那里得到-1:-)@downvoter这只是一个例子,我想,有人可以从中得到一些东西,那么为什么要用负号呢?因为你的例子比必要的复杂得多:@MooingDuck是的,但你的例子是C++11。我的不是。过去四年中的任何编译器都有C++11,问题没有提到C++03的要求。但它并不排除给出不同的例子。是的,但没有C++11要求。过去四年中的任何编译器都有C++11,问题没有提到C++03要求。好吧,你是对的,但我写这段代码只是为了说明,在我只看到了两个“忘记这一点”风格的答案之后,这是可能的。顺便说一句,你可能会惊讶于嵌入式领域的ch项目是使用5年以上的工具实现的。猜猜为什么;-)。
std::vector<std::string>() << "AAA" << "BBB";
std::vector<std::string> operator<<(std::vector<std::string>&& op, std::string str) {
  op.push_back(std::move(str));
  return op;
}
#include <vector>
#include <string>
#include <iostream>

const std::vector<std::string>& operator << (const std::vector<std::string>& op, const std::string &str) 
{
    ((std::vector<std::string>&) op).push_back(str);
    return op;
}

int main()
{
    std::vector<std::string> a = std::vector<std::string>() << "A" << "B";
    a << "AAA";

    std::cout << "size: " << a.size() << std::endl;
    for (std::vector<std::string>::iterator i = a.begin(); i != a.end(); ++i)
    {
        std::cout << '\t' << *i << std::endl;
    }

    return 0;
}
#include <vector>
#include <string>

typedef std::string String;
typedef std::vector<String> StringVector;

class StringVectorWrapper {
    StringVector vector;
public:    
    operator StringVector&() {
        return vector;        
    }

    StringVectorWrapper& operator << (const String& str) {
        vector.push_back(str);
        return *this;
    }
};
#include <iostream>    

void printVector(const StringVector& vector) {
    for(StringVector::const_iterator it = vector.begin(); it != vector.end(); it++)
        std::cout << *it << std::endl;
}

int main(void) {

    StringVectorWrapper w;
    w << "A" << "B";    
    printVector(w);

    printVector(StringVectorWrapper() << "Z" << "W");


    return 0;
}