2017-06-16 227 views
0

我想知道是否有解決方案來指定一個模板,以便可以傳遞void或任何其他類型。 以下是一個非常簡單的例子,如果TReturn也是void,它應該不做任何事情,只返回void,或者返回函數的返回值(它也返回TReturn,但有區別,它實際上是一個類型) 。C++ void或任何類型作爲模板參數

template <typename TReturn> 
TReturn Foo(std::function<TReturn()> function) 
{ 
    if(std::is_same<TReturn, void>::value) 
    {   
     // I am not sure what to put here 
     return function(); 
    } 

    TReturn returnValue = function(); 
    // Do some stuff with the returnValue here 
    return returnValue; 
} 

現在顯然我做了錯誤,因爲函數不能返回兩種不同的類型。這就是爲什麼我問,有沒有人知道如何做到這一點?

任何幫助表示讚賞樂意

+1

這裏錯誤的是你假設'TReturn'是默認的可構造的(哪個'void'不是)。否則,這對我來說似乎沒問題。 – davidhigh

+0

另一個錯誤是,你試圖產生'返回空'而不是'返回' –

+0

@ManishBaphna是的,我知道它的錯誤,這就是爲什麼我正在尋找一種方式,使非空''類型的聲明是真實的並找到另一個'空' –

回答

8

您可以使用過載:

template <typename TReturn> 
TReturn Foo(std::function<TReturn()> function) 
{ 
    TReturn returnValue = function(); 
    // Do extra stuff with return value. 
    return returnValue; 
} 

void Foo(std::function<void()>) 
{ 
    return function(); 
} 

在C++ 17,你將有constexpr如果

template <typename TReturn> 
TReturn Foo(std::function<TReturn()> function) 
{ 
    if constexpr (std::is_same<TReturn, void>::value) { 
     return function(); 
    } else { 
     TReturn returnValue = function(); 
     // Do extra stuff with return value. 
     return returnValue; 
    } 
} 
+0

謝謝你,我也想出了,但我想也許會有一個解決方案只有一個功能。如果不是,我將使用你的所以謝謝 –

2

C++ 17的解決方案:

template <typename TReturn> 
TReturn Foo(std::function<TReturn()> function) 
{ 
    if constexpr (std::is_same<TReturn, void>::value) 
//  ^^^^^^^^^ 
    {   
     return function(); 
    } else { 
     TReturn returnValue = function(); 
     return returnValue; 
    } 
} 

否則,如果你想要決定是否返回一個值,或者不是在編譯時做出,AFAIK你將需要兩個不同的函數(正如在antother答案中所建議的那樣)。

+0

謝謝,我真的很期待能夠在C++ 17中使用它。它似乎更容易使用。 –

相關問題