void或任何类型作为模板参数

时间:2017-06-16 21:25:38

标签: c++ templates return-value void

我想知道是否有指定模板的解决方案,以便可以传递void或任何其他类型。 以下是一个非常简化的示例,如果voidTReturn,则只返回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;
}

现在显然我所做的是错误的,因为函数不能返回两种不同的类型。这就是我要问的原因,有没有人知道这样做的方法?

非常感谢任何帮助

2 个答案:

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

,你将拥有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;
    }
}

答案 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您将需要两个不同的功能(如另一个答案所示)。