簡體   English   中英

如何使 std::make_pair 可與 std::bind* 一起使用?

[英]How can I make std::make_pair usable with std::bind*?

我想將std::make_pairstd::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 ) );

但我想知道 - 除了手動編寫像pair_creator這樣的小包裝類之外,是否有一種更簡單的方法可以使std::make_pair (或可能的任何其他二進制函數)與綁定器pair_creator使用?

我需要一個 C++03 解決方案(出於某些晦澀的原因,stackoverflow 在保存帖子時總是將我的標記重寫為 ...)。

您需要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));

使用 lambda 不需要使用綁定適配器。

    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);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM