STL:std::bind1st std::unary_function
STL: std::bind1st for std::unary_function
AFAIK std::bind1st
采用二元仿函数和参数,returns 具有已绑定第一个参数的一元仿函数。 STL是否提供了一个类似于std::bind1st
的函数,它接受一个一元函数和一个参数,而returns一个没有参数的函数?
编辑:我需要一个比 C++11 更旧的版本的解决方案(我没有放那个标签)
一种方法是自己写活页夹
template<typename FUNCTION, typename ARG_TYPE, typename RETURN_TYPE>
struct bind_it
{
FUNCTION function;
ARG_TYPE argument;
bind_it(ARG_TYPE value, FUNCTION f):function(f){
argument = value;
}
RETURN_TYPE operator()(){
return function(argument);
}
};
我确信有更好的方法来编写活页夹。
并像
一样使用它
int f(int i){
return i + 2;
}
int main()
{
bind_it<int(*)(int), int, int> bound(5, f);
int se7en = bound();
}
似乎STL没有提供解决方案(std::bind
来自C++11),所以我的版本是:
#include <iostream>
#include <functional>
template <typename Operation>
class bound_unary_function
: public std::unary_function<typename Operation::argument_type,
typename Operation::result_type> {
typedef bound_unary_function<Operation> _Self;
Operation op;
typename _Self::argument_type arg;
public:
bound_unary_function(const Operation& _op, const typename _Self::argument_type& _arg)
: op(_op), arg(_arg) { }
typename _Self::result_type operator()() {
return op(arg);
}
};
template <typename Operation>
bound_unary_function<Operation> bind_unary_function(const Operation& op,
const typename Operation::argument_type& arg) {
return bound_unary_function<Operation>(op, arg);
}
int inc(int x) {
return ++x;
}
int main() {
std::cout << "inc(0)=" << bind_unary_function(std::ptr_fun(inc), 0)() << '\n';
return 0;
}
bind_unary_function
比显式构造 bound_unary_function
更方便,因为它具有自动模板参数推导功能。
AFAIK std::bind1st
采用二元仿函数和参数,returns 具有已绑定第一个参数的一元仿函数。 STL是否提供了一个类似于std::bind1st
的函数,它接受一个一元函数和一个参数,而returns一个没有参数的函数?
编辑:我需要一个比 C++11 更旧的版本的解决方案(我没有放那个标签)
一种方法是自己写活页夹
template<typename FUNCTION, typename ARG_TYPE, typename RETURN_TYPE>
struct bind_it
{
FUNCTION function;
ARG_TYPE argument;
bind_it(ARG_TYPE value, FUNCTION f):function(f){
argument = value;
}
RETURN_TYPE operator()(){
return function(argument);
}
};
我确信有更好的方法来编写活页夹。
并像
一样使用它int f(int i){
return i + 2;
}
int main()
{
bind_it<int(*)(int), int, int> bound(5, f);
int se7en = bound();
}
似乎STL没有提供解决方案(std::bind
来自C++11),所以我的版本是:
#include <iostream>
#include <functional>
template <typename Operation>
class bound_unary_function
: public std::unary_function<typename Operation::argument_type,
typename Operation::result_type> {
typedef bound_unary_function<Operation> _Self;
Operation op;
typename _Self::argument_type arg;
public:
bound_unary_function(const Operation& _op, const typename _Self::argument_type& _arg)
: op(_op), arg(_arg) { }
typename _Self::result_type operator()() {
return op(arg);
}
};
template <typename Operation>
bound_unary_function<Operation> bind_unary_function(const Operation& op,
const typename Operation::argument_type& arg) {
return bound_unary_function<Operation>(op, arg);
}
int inc(int x) {
return ++x;
}
int main() {
std::cout << "inc(0)=" << bind_unary_function(std::ptr_fun(inc), 0)() << '\n';
return 0;
}
bind_unary_function
比显式构造 bound_unary_function
更方便,因为它具有自动模板参数推导功能。