我想知道是否有指定模板的解决方案,以便可以传递void
或任何其他类型。
以下是一个非常简化的示例,如果void
为TReturn
,则只返回void
,或者返回函数的返回值(返回TReturn
)也是,但有区别,那它实际上是一种类型。)
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;
}
现在显然我所做的是错误的,因为函数不能返回两种不同的类型。这就是我要问的原因,有没有人知道这样做的方法?
非常感谢任何帮助
答案 0 :(得分: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中,如果
,你将拥有constexprtemplate <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;
}
}
答案 1 :(得分: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您将需要两个不同的功能(如另一个答案所示)。