Как я могу сделать использование std :: make_pair с помощью std :: bind *? - PullRequest
3 голосов
/ 16 ноября 2011

Я хотел бы использовать std::make_pair для использования, например, с. std::bind2nd, чтобы я получил унарный функциональный объект, который я мог бы использовать, например, с. std::transform.

Прямо сейчас я использую

template <typename T, typename U>
struct pair_creator : std::binary_function<T, U, std::pair<T, U> >
{
    std::pair<T, U> operator()( T arg1, U arg2 ) const {
        return std::make_pair( arg1, arg2 );
    }
};

// ...

std::transform( start1, end2, start2, std::bind2nd( pair_creator<int, bool>(), true ) );

но мне интересно - есть ли более простой способ сделать std::make_pair (или, возможно, любую другую двоичную функцию) пригодной для использования со связывателями, кроме как путем написания небольших классов-оболочек, таких как pair_creator, вручную?

Мне нужно решение на C ++ 03 (по какой-то непонятной причине stackoverflow всегда переписывает мой тег в при сохранении сообщения. ..).

Ответы [ 2 ]

4 голосов
/ 16 ноября 2011

Вам нужен std::ptr_fun, который превращает простой указатель функции в адаптируемый двоичный объект функции (или объект унарной функции, если вы передаете ему функцию с одним аргументом):

#include <functional>
#include <utility>
#include <vector>
#include <algorithm>
#include <iostream>

int main() {
    std::vector<int> intvec;
    intvec.push_back(0);
    intvec.push_back(1);
    std::vector<std::pair<int,bool> > pairvec(intvec.size());
    std::transform(
        intvec.begin(),
        intvec.end(),
        pairvec.begin(),
        // this is the significant line
        std::bind2nd(std::ptr_fun(std::make_pair<int, bool>), true)
    );
    std::cout << pairvec[1].first << " " << pairvec[1].second << "\n";
}

ptr_fun объявлено:

template <class Arg1, class Arg2, class Result>
pointer_to_binary_function<Arg1,Arg2,Result>
ptr_fun(Result (*)(Arg1,Arg2));

А для одинарной версии:

template <class Arg, class Result>
pointer_to_unary_function<Arg,Result>
ptr_fun(Result (*)(Arg));
0 голосов
/ 05 февраля 2015

Использовать лямбду, не нужно использовать адаптер связывания.

    std::vector<int> start1 = list_of(1)(2)(3)(4)(5);
    std::vector<int> start2 = list_of(10)(20)(30)(40)(50);
    std::vector<Pair> w_vecofpair; // vector of pair
    w_vofpair.reserve(start1.size()); 
    // create pair using lambda
    std::transform( std::begin(start1), std::end(start1), std::begin(start2), // ranges 
        std::back_inserter(w_vecofpair),  // result 
        [](int a,int b) { return std::make_pair(a,b);}); // pair creator

    for (auto& pairInt : w_vecofpair)
    {
        std::cout << pairInt << "\n"; 
    }

    // bind 2nd arg to some value, say 2
    std::transform( std::begin(start1), std::end(start1), std::begin(start2), 
        std::back_inserter(w_vecofpair), [](int a, int b) { return std::make_pair(a,2);});

    for (auto& second : w_vecofpair | map_values)
    {
        std::cout << "The second value of our bind 2nd is: " << second << "\n";
        assert(second==2);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...