2015-05-07 48 views
0

我有以下模板函數:獲取函數的第一個參數的類型模板函數的返回類型

template<class T, class F> T function(F& f) { 
     ... 
     T t; 
     f(t); 
     return t; 
} 

據預計以這種方式使用帶有F與形式

void some_function(SomeType& s); 

function<SomeType>(some_function); 

第一個模板參數似乎是多餘的,因爲可以從參數的參數推導出來ter功能。 問題是 存在一種方法來擺脫第一個模板參數?

喜歡的東西

template<class F> first_param_type<F> function(F& f) { 
     ... 
     first_param_type<F> t; 
     f(t); 
     return t; 
} 

所以,我可以用它作爲

function(some_function); 

回答

3
template<class T> 
T function(void(*f)(T&)) { 
    ... 
    T t; 
    f(t); 
    return t; 
} 

的規定解決問題。一般問題無法解決(其中F是任意可調用的),因爲C++中的可調參數可以接受多於一種類型,並且推導出哪些類型是可接受的,在一般情況下無法解決。

如果你有一個你支持的類型列表,它通常可以解決。

C++ 14的基本問題是function([](auto&x){ std::cout << x << '\n'; })。在帶有模板operator()的函數對象的C++ 11中也存在同樣的問題。自動lambda表達式在C++ 14中得到支持的事實意味着這樣的對象將在未來變得越來越普遍。

請考慮更改您的設計,使F的簽名爲T()而不是void(T&)。然後我們得到:

template<class F> 
std::result_of_t<F()> 
function(F&& f) { 
    ... 
    return std::forward<F>(f)(); 
} 

typename std::result_of<F()>::type在C++ 11。

0

我希望我理解你的問題,也許我錯了......

首先我期待你的模板函數必須被調用,並呼叫它需要我不能在你的示例代碼中發現的附加參數。

不過沒關係,我希望你可以做什麼:

#include <iostream> 
using namespace std; 

template <typename RetType, typename ... Parms> 
auto TemplateFunction (RetType(*ptr)(Parms ...), Parms ... parms) -> RetType 
{ 
    RetType ret; 
    ret = (*ptr)(parms...); 
    cout << "Value ret in Wrapper is:" << ret << endl; 
    return ret; 
} 

double AnyFunc(int a, int b) { return 3.14 * a + b; } 
std::string OtherFunc() { return "Hallo"; } 

int main() 
{ 
    double result = TemplateFunction(&AnyFunc, 1,3); 

    cout << "Result is " << result << endl; 

    cout << TemplateFunction(&OtherFunc) << endl; 
} 

正如你已經提到的,沒有必要給予返回類型爲額外的參數,因爲它可以在給定類型中找到在呈現給模板的函數指針中。

包裝模板適用於所有返回類型,但不適用於void

0

UPDATE

我絕對Yakk的答案同意我只是想提的,但其他方式非常相似:

#include <functional> 

template < class Type > 
Type myFunction(const std::function< void(Type&) >& aFunction) 
{ 
    Type instance; 
    aFunction(instance); 
    return instance; 
} 
+0

你必須做雖然明確的轉換,這是刺激性。 –

+0

對不起,我錯過了。我在一分鐘內修好它。感謝您的通知。 –

相關問題