【问题标题】:Does std::tuple accept auto as a typestd::tuple 是否接受 auto 作为类型
【发布时间】:2016-08-17 19:25:51
【问题描述】:

我必须向调用者返回一个 int 和一个函数对象,我想返回一个像 make_tuple(int,[](some){}) 这样的元组我现在在不支持 decltpe(auto) 作为返回类型的 GCC 上,有什么办法吗我现在可以将我的返回类型设为std::tuple<int,auto> myfun() 我一直在做如下(但不确定)

auto myfun()->decltype(make_tuple(100,p))
{
   auto p=[](some){};
   return make_tuple(100,p);
}

我在做什么好吗?

【问题讨论】:

  • 这可以编译吗?不应该。
  • 这里为什么需要decltype(auto)?如果你的编译器支持函数的返回类型推导,那么去掉上面示例中的尾随返回类型应该可以工作。
  • 所以在这里提出问题比创建一个简单的测试用例并尝试编译它更快?
  • @FallingFromBed 你总是可以创建一个minimal reproducible example 并编译它来测试。那会告诉你它不会编译。
  • @FallingFromBed 你有什么CPU?在我的电脑上编译这个需要几分之一秒。几乎无法忍受。

标签: c++ c++11 auto stdtuple


【解决方案1】:

不,因为p 在该范围内不可用,并且 lambda 表达式不应出现在未计算的上下文(即 decltype)中。 (查看更多here

但是,您可以将其包装在 std::function 中:

std::tuple<int, std::function<void(some)>> myfun()
{
  std::function<void(some)> p = [](some){};
  return std::forward_as_tuple(100, p);
}

【讨论】:

  • std::funciton 在最初不需要的地方添加间接。我不喜欢这样。
  • @SergeyA 你不能返回你不知道的类型。如果不将类型放在函数之外,我看不到更好的方法。
  • 与@SergeyA 的评论相同。如果没有捕获变量,我会使用函数指针而不是 std::function (--没有通过类型擦除的间接)......或者更好地避免这个问题并在函数之外定义 p
  • @davidhigh:函数指针和std::function 一样糟糕(不可能内联)。如果性能真的那么关键,那么可调用类型应该在函数之外定义。
  • @NathanOliver,我也没有 - 或者我会在答案中提供一个。我仍然可以不喜欢这个,不是吗?
猜你喜欢
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 2011-06-20
相关资源
最近更新 更多