ptr_fun - 无法创建类型?

时间:2012-07-03 08:45:36

标签: c++ functor

我该怎么做:

#include <functional>

#include <boost/functional.hpp>

int foo(int){return 1;};

template<typename T>
int bar(T t)
{
  return 10;/*or something*/
}

int main() {

  bar<   std::ptr_fun<int, int>(foo) > (1);
  bar< boost::ptr_fun<int, int>(foo) > (1);

  return 0;
}

在两个ptr_fun-lines中我得到error C2974: 'bar' : invalid template argument for 'T', type expected。据我所知prt_fun创建了一个类型,但std::ptr_fun<int, int>(foo)创建了一个对象。 有没有办法用函数指针usinf创建一个“初始化”类型尽可能多的std?

可能可以通过manualy编写一个仿函数来解决这个问题,但我相信那里有ptr_fun-way。

1 个答案:

答案 0 :(得分:3)

ptr_fun返回pointer_to_unary_function类型的对象。你声明你的模板采用了一个类型参数,所以明确地传递一个对象是行不通的。

你可以让它像这样工作(注意你不需要指定模板参数,它可以由编译器推导出来):

#include <iostream>
#include <functional>

int foo(int i)
{
    return i;
}

template<typename TResult, typename TArg>
int bar(std::pointer_to_unary_function<TArg, TResult> p, TArg arg)
{
    return p(arg);
}

int main()
{
    std::cout << bar(std::ptr_fun<int, int>(foo), 42);
}

但你真的不需要ptr_fun。你可以这样做:

#include <iostream>
#include <functional>

int foo(int i)
{
    return i;
}

template<typename TFunc, typename TArg>
int bar(TFunc f, TArg arg)
{
    return f(arg);
}

int main()
{
    std::cout << bar(foo, 42);
}

或者,让它像你设置一样工作:

int foo(int i) { return i; }

template<typename T>
int bar(T t)
{
    t(42);
}

int main() {
  std::cout << bar( std::ptr_fun<int, int>(foo) );
}
很多quesswork,因为它不是很清楚你想要完成什么。