2012-07-03 86 views
0

我怎么可以做一些事情,如:ptr_fun - 无法创建类型?

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

大概可以解决这个通过manualy编码仿函数,但我相信有ptr_fun方式。

+0

你不能“初始化”一个类型。我不明白你想在你的例子中使用'T'。它应该是'int'吗?或者''指向非const函数的那个​​类型需要-int-int-and-returns-an-int'? – Mat

+0

''bar''就是一个例子,它不是“真正的”代码。我需要用另一个函数来初始化一个模板函数(bar),它将完成不同的工作。所以,据我所知,我需要将函数转换为类型。这是什么ptr_fun做... – fogbit

+2

不,“ptr_fun”不“返回类型”。它返回[pointer_to_unary_function]的一个对象(http://en.cppreference.com/w/cpp/utility/functional/ pointer_to_unary_function) – jrok

回答

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的,becase的这不是真的清楚你要完成的任务。

+0

谢谢你的好解释,现在'ptr_fun'对我来说看起来更加清晰。 – fogbit