1

次のコードをC++と潜在的にブーストライブラリを使用して1つのライナーに単純化する良い方法はありますか?基本的に、メンバー関数としてtitle()を持つメッセージのリストがあります。特定のタイトルのメッセージがリストに存在するかどうかを知りたい。

std::string title = "some title";
bool unique = true;

BOOST_FOREACH(Message& m, messages) {
    if (m.title() == title) {
        unique = false;
        break;
    }
}

C#Linqに精通している場合は、次のC++バージョンが最適です。

unique = (messages.FirstOrDefault(m => m.title() == title) == null);

残念ながら、C ++ 11は使用できませんが、C ++ 11の例がある場合は、後で参照できるようにしたいと思います。

前もって感謝します。

4

2 に答える 2

1

ブーストを使用する C++ では、次のようなことができるはずです。

bool unique = boost::find_if(messages, boost::bind( &Message::title, _1 ) == title) == messages.end();

C++11 でLinqをブースト付きで使用すると、次のように記述できるはずです。

bool unique = boost::empty(LINQ(from(m, message) where(m.title() == title)));

first_or_defaultデフォルト値は null ポインターではないため、C++ で同じものを使用することはできません。

于 2013-02-13T22:54:59.430 に答える