4

我正在编写一个大量使用咖喱对象和模板的项目。c++11的新decltype特性意味着我可以开始接受没有明确定义返回类型的函数对象作为我的函数对象的 curry。相反,可以使用元函数提取返回类型,例如:

template<typename func_T, typename arg1_T>
struct unary_result {
  typedef typename std::remove_reference<typename std::remove_cv<decltype(func_T()(arg1_T()))>::type>::type type;
};

给定一个函数对象:

struct foo {
  int operator()(double) const;
};

(它不继承std::unary_function<double, int>或定义它result_type),我可以将它作为unary_result<foo, double>::type,这在我当前的代码中运行良好(一方面,它允许相同的函数对象对不同的参数具有不同的行为)。

我的问题是:这将如何与函数指针交互?

我知道 STL 能够互换使用函数对象和函数指针,但从未真正使用过函数指针,所以我的直觉在这方面没有得到很好的发展。我也知道这可能已经埋藏在 Boost 的某个地方(如果是这种情况,我相信有人会很快指出这一点)。

4

1 回答 1

3

unary_result应该可以很好地使用函数指针,尽管你需要一个额外的typenamebefore std::remove_cv

例子:

#include <type_traits>

template<typename func_T, typename arg1_T>
struct unary_result {
  typedef typename std::remove_reference<typename std::remove_cv<decltype(func_T()(arg1_T()))>::type>::type type;
};

struct foo {
    int operator()(double d) const
    {
        return d;
    }

};

int bar(int i){
    return i;
}

template<typename Func,typename Arg>
typename unary_result<Func,Arg>::type do_stuff(Func f,Arg a){
    return f(a);
}

int main(){
    int i=do_stuff(bar,42);
    int d=do_stuff(foo(),3.1);
}
于 2012-05-15T07:15:38.893 回答