C++11 std::tuple 到 std::array 转换导致可变参数模板崩溃

标签 c++ templates c++11 tuples variadic-templates

以下函数 toArray 可能有一天会将 C++11 std::tuple 转换为 C++11 std::array:

#include <tuple>
#include <array>

template <typename T, typename ...U>
std::array<T,sizeof...(U)>
toArray(std::tuple<U...>) {
  return std::array<T,sizeof...(U)>();
}

如果我尝试用下面的代码调用toArray,在G++ 4.8下我可以编译成功。然而,使用 Clang++ 3.2 编译会使 Clang 前端崩溃。我的代码是有效的 C++ 代码吗?

int main(int argc, char *argv[])
{
  auto tup = std::make_tuple(1,2,3,4,5,6,7,8);
  toArray<int>(tup);
  return 0;
}

最佳答案

对我来说它看起来有效,并且完成的版本可以很好地与 G++ 一起工作:

#include <redi/index_tuple.h>
template <typename T, typename... U, unsigned... N>
  std::array<T, sizeof...(U)>
  toArray2(std::tuple<U...>& t, redi::index_tuple<N...>) {
    return std::array<T, sizeof...(U)>{{ std::get<N>(t)... }};
  }

template <typename T, typename ...U>
  std::array<T, sizeof...(U)>
  toArray(std::tuple<U...> t) {
    return toArray2<T>(t, redi::to_index_tuple<U...>{});
  }

int main()
{
  auto tup = std::make_tuple(1,2,3,4,5,6,7,8);
  return toArray<int>(tup)[3] - 4;
}

关于C++11 std::tuple 到 std::array 转换导致可变参数模板崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12964610/

相关文章:

c++ - 当 X 按钮使用 closeEvent 时如何只关闭子窗口?

先前声明的 C++ 函数

c++ - C11/C++11 内存模型

c++ - 如何在ChaiScript 中注册重载的模板成员函数?

c++ - 如何重载继承类中的方法,以便基类看到继承的版本?

c++ - 为什么类的方法不能访问我类的某些字段?

c++ - static const int 成员和 undefined reference

c++ - 关于对象大小的 `static_assert` 的更好消息

c++ - 如何使用std::auto_ptr实现协方差赋值?

c++ - 基类模板实例化取决于派生类构造函数参数类型