我想使用 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 总是在保存帖子时将我的 c++0x 标记重写为 c++11...)。
最佳答案
您需要 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/