3

に追加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>&ので、1行でベクトルを渡したいと思います。

4

5 に答える 5

2

私は実際にこれの結果について適切に考えていませんが、右辺値の過負荷が発生する可能性があるようです。

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

はい、値で戻りますが、§12.8/ 32により、移動に最適化されます。

ソースオブジェクトが関数パラメーターであり、コピーされるオブジェクトが左辺値で指定されていることを除いて、コピー操作の省略基準が満たされている、または満たされる場合、コピーのコンストラクターを選択するためのオーバーロード解決は次のようになります。最初は、オブジェクトが右辺値で指定されているかのように実行されます。

于 2013-03-23T20:33:17.017 に答える
2

できません。それを実現できる唯一の方法は、オペレーターがベクターのメンバーである場合です。(何らかの理由で、一時的にメンバー関数を呼び出すことができます)。

あなたが求めていることは不可能ですが、非メンバー関数として

また、std::vector などの STL 型の演算子をオーバーロードすることもあまりお勧めできません。あなたが達成しようとしていることは、すでにブースト割り当てライブラリに存在していると思います。彼らよりも上手に書けるとは思えないので、これが必要な場合は boost を使用することをお勧めします。

于 2013-03-23T20:22:43.110 に答える
1

まあ...技術的には実行可能ですが、汚いスタイルです。説明のためだけに(実際に実装する価値があるかどうかはわかりません)。GCC4.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;
}
于 2013-03-23T20:43:07.137 に答える
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;
}

しかし、私はどのプログラムでもそのようなコードを使用しません。

于 2013-03-23T21:28:05.730 に答える
-1

これは不可能だと思います。また、標準ライブラリ クラスの演算子をオーバーロードすることもお勧めできません。STL は拡張されることを意図していません。

于 2013-03-23T20:22:34.793 に答える