我该怎么做:
#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。
答案 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,因为它不是很清楚你想要完成什么。