G++ 4.5.0中的std::forward_as_tuple

4
我急需使用std::forward_as_tuple函数,但我只能使用GCC 4.5.0(我知道这是一个困难的局面,但这可以解决很多问题,请尽量减少嘲讽的话)。头文件<tuple>似乎不包含该函数(理应包含),所以我的问题是:
  1. 它是否隐藏在其他头文件中?(这种情况已经发生过,但很难确定。)
  2. 是否可能自己实现?也就是说:它是否可以使用GCC 4.5.0中已实现的c++11部分来实现?如果有人真正知道如何做到这一点,那就更好了。
2个回答

5

实现很简单:

template <typename... Elements>
/*constexpr*/ tuple<Elements&&...>
forward_as_tuple(Elements&&... args) /* noexcept */
{
    return tuple<Elements&&...>(std::forward<Elements>(args)...);
}

不知道在哪个GCC版本中出现。根据这个文档,可变模板和右值引用从GCC 4.3开始就可用了,所以它应该可以在您的GCC 4.5上工作(我希望如此)。


你需要移除 noexcept,因为我相信 gcc 4.5 不支持它。 - Jesse Good
谢谢!那确实是一个简单而直接的实现。 - masaers

1
它是否隐藏在其他标题中?(这种情况以前发生过,但很难确定。)
grep有什么难的?

标题似乎不包含该函数(应该包含)

std::forward_as_tuple最初被称为std::pack_arguments,并在2010年3月的N3059中提出,首次出现在N3092工作草案中。当时GCC 4.5.0发布于2010年4月,而那个草案还没有完全定稿。
请随意尝试在未维护的、预C++11编译器中使用C++11功能,但说它应该包括甚至不存在的功能,当时版本分支正在剪切和准备新版本时,这有点不公平!

你至少应该使用GCC 4.5.4,使用点零版本只会带来麻烦,它将充满新的错误,在后续的4.5.x版本中已经修复了这些错误(尽管它仍然不包括forward_as_tuplepack_arguments,它们首次出现在GCC 4.6中)

你可以考虑使用boost::tuple,它试图为旧编译器提供功能完整的实现。


如果我的言辞冒犯了你,我深感抱歉。这并非我的本意。正如我所说,我知道我的问题的前提不够完善,而且我正在修补一些不完整的事情。GCC版本不在我的控制范围内(如果在的话,我会使用最新版本),再次强调,这个问题是以特定版本为前提提出的。谢谢你建议使用Boost(对我来说也不是一个选择,但我现在已经学会在我的问题中明确说明这一点)。 - masaers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接