ptr_fun - 无法创建类型?

ptr_fun - can't create a type?

本文关键字:创建 类型 fun ptr      更新时间:2023-10-16

我怎样才能做一些类似的事情:

#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行中,我都得到了error C2974: 'bar' : invalid template argument for 'T', type expected.据我所知,prt_fun创建一个类型,但std::ptr_fun<int, int>(foo)创建一个对象。有没有办法尽可能多地使用函数指针 usinf 创建"初始化"的类型?

可能可以通过手动编码函子来解决这个问题,但我相信有ptr_fun方法。

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

很多问题,以防万一你真的不清楚你想完成什么。