繁体   English   中英

无效或任何类型作为模板参数

[英]void or any type as a template parameter

我想知道是否有解决方案来指定模板,以便可以传递void或任何其他类型。 以下是一个非常简化的示例,除了TReturnvoid返回void ,或者返回函数的返回值(也返回TReturn ,但不同的是,它实际上是类型),什么都不要做,但返回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;
}

现在显然我做错了,因为一个函数不能返回两种不同的类型。 这就是为什么我要问,有人知道这样做的方法吗?

任何帮助都将不胜感激

您可以使用重载:

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中,如果

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;
    }
}

否则,如果要在编译时决定是否返回值,则AFAIK将需要两个不同的功能(如其他回答中所建议)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM