STL:std :: bind1st用于std :: unary_function

时间:2015-03-16 15:35:42

标签: c++ stl functional-programming bind

AFAIK std::bind1st接受二元仿函数和参数,并返回一个已绑定第一个参数的一元仿函数。 STL是否提供了一个类似于std::bind1st的函数,它接受一元函数和一个参数,并返回一个没有参数的函数?

编辑:我需要一个旧版本的解决方案,而不是C ++ 11 (我没有放置该标签)

2 个答案:

答案 0 :(得分:0)

一种方法是自己编写活页夹

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

答案 1 :(得分:0)

似乎,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更方便,因为它具有自动模板参数推导功能。