2012-07-03 88 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