0

我该怎么做:

#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尽可能多地创建一个“初始化”类型?

可能可以通过手动编写仿函数来解决这个问题,但我相信有 ptr_fun 方式。

4

1 回答 1

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

大量的任务,因为它不是很清楚你想要完成什么。

于 2012-07-03T09:15:54.130 回答