2017-06-16 226 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中使用它。它似乎更容易使用。 –

相关问题