void 或任何类型作为模板参数
void or any type as a template parameter
我想知道是否有指定模板的解决方案,以便可以传递 void
或任何其他类型。
下面是一个非常简单的例子,如果 TReturn
也是 void
,那么除了 return void
什么都不做,或者 return return函数的值(也是 returns 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;
}
很明显我做错了,因为一个函数不能return两种不同的类型。这就是为什么我要问的原因,有谁知道这样做的方法吗?
非常感谢任何帮助
您可以使用重载:
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 if
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;
}
}
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;
}
}
否则,如果您想在编译时决定是否 return 一个值,AFAIK 您将需要两个不同的函数(如另一个答案中所建议的)。
我想知道是否有指定模板的解决方案,以便可以传递 void
或任何其他类型。
下面是一个非常简单的例子,如果 TReturn
也是 void
,那么除了 return void
什么都不做,或者 return return函数的值(也是 returns 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;
}
很明显我做错了,因为一个函数不能return两种不同的类型。这就是为什么我要问的原因,有谁知道这样做的方法吗?
非常感谢任何帮助
您可以使用重载:
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 if
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;
}
}
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;
}
}
否则,如果您想在编译时决定是否 return 一个值,AFAIK 您将需要两个不同的函数(如另一个答案中所建议的)。