Тестирование определенного члена данных структуры с помощью std :: equal_to и т. Д. - PullRequest
1 голос
/ 29 февраля 2012
#include <algorithm>
#include <functional>
#include <vector>

struct blah {
    int member;
};

int main (int argc, const char* argv[])
{
    blah a = { 1 };
    auto are_same = std::bind(
            std::equal_to<blah>(),
            a,
            std::mem_fn(&blah::member)   // Obviously not a function, but I tried.
        );

    std::vector<blah> blahs = { {0}, {1}, {2} };
    return static_cast<int>(std::any_of(blahs.begin(), blahs.end(), are_same));
}

Эта программа не может скомпилировать (GCC 4.4):

error: no match for call to ‘(std::equal_to<blah>) (blah&, std::_Mem_fn<int blah::*>&)’

Помимо самого кодирования цикла, как правильно проверить эквивалентность на основе элемента данных?

Ответы [ 2 ]

4 голосов
/ 29 февраля 2012

Если вы уже используете C ++ 11, почему бы не использовать лямбду?

int main (int argc, const char* argv[])
{
    blah a = { 1 };
    auto are_same = [=](blah const& b) -> bool {
        return a.member == b.member;
    };

    std::vector<blah> blahs = { {0}, {1}, {2} };
    return static_cast<int>(std::any_of(blahs.begin(), blahs.end(), are_same));
}

Если вы не можете использовать лямбда-выражения, вы можете использовать bind для создания функции:

using namespace std::placeholders;
auto are_same = std::bind(
  std::equal_to<int>(),
  std::bind(&blah::member, _1),
  std::bind(&blah::member, a)
);
2 голосов
/ 29 февраля 2012

Помимо самого кодирования цикла, как правильно проверять эквивалентность на основе элемента данных?

Обычным способом проверки эквивалентности является реализация operator==.В вашем случае, я думаю, это будет выглядеть так:

bool operator==( const blah & lho, const blah & rho )
{
  return ( lho.member == rho.member );
}
...