c++ - 如何使 std::make_pair 可与 std::bind* 一起使用?

标签 c++ templates

我想使用 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 (或任何其他二进制函数)可与绑定(bind)器一起使用,除非通过编写像 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));

关于c++ - 如何使 std::make_pair 可与 std::bind* 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8152135/

相关文章:

c++ - 用于 boost 序列化的与顺序无关的输入存档

使用 typename 并将 typedef 传递给函数的 C++ 模板

没有正则表达式解析模板?

c - 是否可以在 C 中编写与类型无关的函数,并在实现中派生类型?

c++ - 非常基本的模板功能出现问题

c++ - 在 Outlook 2010 中使用 VC10 dll(outlook 插件)

C++:函数重载和声明顺序的困惑

c++ - Qt 读取 XML 文件

c++ - 如何使用反向迭代器从 `std::set` 删除元素?

spring - JSP 是否被取代,如果是,如何被取代?