【问题标题】:void or any type as a template parametervoid 或任何类型作为模板参数
【发布时间】:2017-11-19 18:15:40
【问题描述】:

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

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

非常感谢任何帮助

【问题讨论】:

  • 这里的错误是您假设TReturn 是默认可构造的(void 不是)。否则,我觉得没问题。
  • 另一个错误是你试图生成'return void'而不是'return'
  • @ManishBaphna 是的,我知道这是错误的,这就是为什么我一直在寻找一种方法来使该声明适用于非 void 类型并为 void 找到另一种方法
  • 这看起来很奇怪——当Foo 被调用时,参数是一个返回类型为void 的函数,你不想调用它,但不然呢?如果目标是始终调用传递的函数,您只需调用它:return function();。当返回类型为 void 时,这是允许的,对于这种确切的情况。
  • @PeteBecker 你是对的,我很抱歉。没有注意到,当然我想调用该函数,而不管传递给Foo 的类型如何。我将立即尝试您的解决方案。

标签: c++ templates return-value void


【解决方案1】:

你可以使用重载:

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

【讨论】:

  • 谢谢你,我也想出了这个,但我想也许会有一个只有一个功能的解决方案。如果不是,我将使用你的,谢谢
【解决方案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 您将需要两个不同的函数(如另一个答案中所建议的那样)。

【讨论】:

  • 谢谢,我真的很期待能够在 C++17 中使用它。它似乎更容易使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-24
  • 2019-09-23
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
相关资源
最近更新 更多