Извлечение члена структуры из массива структур - PullRequest
0 голосов
/ 28 октября 2010

У меня есть массив структур, которые содержат несколько переменных:

struct test_case {
    const int input1;
    //...
    const int output;
};

test_case tc[] = {
    {0,  /**/  1},
    //  ...
    {99, /**/ 17}
};

int tc_size = sizeof(tc) / sizeof(*tc);

и я хочу извлечь вектор из output s, чтобы я мог сравнить их с другим массивом через BOOST_CHECK_EQUAL_COLLECTIONS.

Я придумал это:

struct extract_output {
    int operator()(test_t &t) {  
        return t.output;  
    }
}

std::vector<int> output_vector;

std::transform(test_cases, 
               test_cases + tc_size, 
               back_inserter(output_vector), 
               extract_output());

но, похоже, я смогу сделать это без функтора / структуры для каждого типа.

Есть ли более быстрый способ извлечь вектор / массив из одной переменной из структуры? Я пытался использовать boost :: lambda, но это не сработало:

std::transform(test_cases, 
               test_cases + tc_size, 
               back_inserter(output_vector), 
               _1.output);

Очевидно, operator.() нельзя использовать с лямбда-переменными ... что мне использовать? повышение :: BIND?

1 Ответ

2 голосов
/ 28 октября 2010

Да, добавив boost :: bind - это ответ:

std::transform(test_cases, 
               test_cases + tc_size, 
               back_inserter(output_vector), 
               boost::bind(&test_case::output, _1));

Это работает, потому что std::transform передает параметр test_case в функтор, сгенерированный bind(). Функтор применяет синтаксис указателя члена (&T::x) для извлечения и возврата переменной члена.

...