2017-09-03 20 views
0

假設我有一個函數要傳遞給窗體的另一個函數。如何確保模板函數的參數與另一個參數的參數匹配

auto f = [](double x) -> double { 
    // ... 
    return 2.0; 
}; 

或這種形式:

double f(double x) { 
    // ... 
    return 2.0; 
}; 

我希望有一個模板函數取女,與將用於調用F的另一個理由。

類似:

template <typename F, typename T> 
T use_function(F func, T t) 
{ 
    return func(t); 
}; 

但我要強制執行T具有相同類型爲f的返回類型。我的主要問題是,當我打電話使用功能,像這樣:

use_function(f, 5); 

T的類型變成一個int。而我正在做數學的東西,這給我錯誤的答案,使用整數。所以,一個解決辦法是執行浮點類型莫名其妙......

我想用這個作爲一個解決方案:

template <typename F, typename T> 
auto use_function(F func, T temp) -> decltype(func(temp)) 
{ 
    decltype(func(temp)) t = temp; // This will convert to double if temp was an int.... 
} 

,你怎麼看待這個問題?

+0

充分暴露於C++ 17,充分利用'auto'關鍵字。所有你需要做的是:'template auto use_function(F func,T t) { return func(t); }'。即使'T'是'int',如果'func'返回一個'double',這就是你會得到的。 –

+0

爲了確保它,我經常在一個'std :: function'對象中包含仿函數。如果有任何不匹配,它應該給編譯時錯誤。 – Vivick

+0

@Vivick你可以輸入一個簡單的例子。不知道你的意思 – CptLightning

回答

0

自動返回類型和參數的完美轉發將允許參數的隱式轉換以最優效率的方式加倍。

#include <iostream> 
#include <iomanip> 

auto f = [](double x) -> double { 
    // ... 
    return 2.0; 
}; 

double f2(double x) { 
    // ... 
    return 2.0; 
}; 

struct doubly_thing 
{ 
    operator double() const { 
     return 6; 
    } 
}; 

template <typename F, typename T> 
auto use_function(F func, T&& t) 
{ 
    return func(std::forward<T>(t)); // optimal implicit conversion here 
}; 

int main() 
{ 
    std::cout << std::setprecision(4) << use_function(f, 5) << std::endl; 
    std::cout << std::setprecision(4) << use_function(f2, 5) << std::endl; 
    std::cout << std::setprecision(4) << use_function(f2, doubly_thing()) << std::endl; 
} 
+0

OP意味着* more *不僅僅是函數調用正在進行中。 – Yakk

0
template <class F, class T, class R=std::result_of_t<F&(T&)>> 
R use_function(F func, T t_in) { 
    static_assert(std::is_same<R, std::result_of_t<F&(R&)>>::value, "type drift error"); 
    R t = std::forward<T>(t_in); 
    return func(t); 
} 

該第一推導基於關的f返回類型的自變量。然後,它會仔細檢查,如果將參數轉換爲返回類型,您仍然會獲取相同的類型。

它將此返回類型存儲在R中。