簡體   English   中英

將operator <<添加到std :: vector

[英]Add operator<< to std::vector

我想將operator<<添加到std::vector<string> 這是運營商

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

現在我可以通過這種方式向元素添加元素:

std::vector<std::string> vec;
vec << "aaa" << "bbb" << "ccc";

但是由於無法通過引用傳遞臨時對象,因此未編譯以下代碼。

std::vector<std::string>() << "AAA" << "BBB";

如何更改代碼以將元素添加到臨時向量中?

我有一個接受const std::vector<std::string>& argument的函數,所以我想在一行中傳遞一個向量。

你不能。 可以實現的唯一方法是,如果您的運營商是向量中的一員。 (由於某種原因,可以在臨時對象上調用成員函數)。

作為一個非成員函數雖然你所追求的是不可能的

另外,為STL類型(如std :: vector)重載運算符也不是一個好主意。 我認為你想要實現的目標已經存在於boost assign庫中。 我不相信你能比他們更好地寫出來,所以如果你需要的話,最好使用boost。

我沒有真正考慮過這種情況的后果,但似乎你可以為rvalues重載:

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

是的,它按值返回,但由於§12.8/ 32,它將針對移動進行優化:

當滿足或將滿足復制操作的省略標准時,除了源對象是函數參數這一事實,並且要復制的對象由左值指定,重載決策選擇復制的構造函數是首先執行,好像對象是由右值指定的。

嗯...技術上它是可行的,但在臟的風格。 僅僅是為了說明(我不太確定它值得真正實現)。 檢查使用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;
}

這是一個代碼,可以幫助您做一些類似於您的想法的事情( http://ideone.com/3lrTxW ):

#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;
}

但我不會在我的任何程序中使用這樣的代碼。

我擔心這是不可能的。 對任何標准庫類重載操作符也是一個壞主意。 STL並不意味着擴展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM