实验make_array,我可以使用大括号init列表作为参数

experimental make_array, can I use brace-init list as arguments?

本文关键字:init 列表 参数 make array 可以使 我可以 实验      更新时间:2023-10-16

我试图实现一个版本的make_array不完全相同,但非常类似:

http://en.cppreference.com/w/cpp/experimental/make_array

我发现这段代码似乎不工作,我对吗?

using MyType = std::pair<int, float>;
constexpr auto the_array = make_array<MyType>({1, 7.5f});

这里的问题似乎是,即使make_array明确指定了第一个模板参数,参数仍然来自参数包,这与显式指定的参数无关。

这意味着代码不能工作。

是否有任何解决方案可以使上述代码工作?

我的版本
template <class Val = void, class... Args,
      class = std::enable_if_t<std::is_void<Val>{}, int>>
constexpr std::array<
std::tuple_element_t
<0,
 std::tuple<Args...>>,
sizeof...(Args)> makeArray(Args &&... args) {
    return {{std::forward<Args>(args)...}};
}
template <class Val = void, class... Args,
      class = std::enable_if_t<!std::is_void<Val>{}, int>>
constexpr std::array<
    Val,
    sizeof...(Args)> makeArray(Args &&... args) {
    return {{std::forward<Val>(args)...}};
}

make_array是一个可变模板函数,可以接受任何类型的参数。然后,它将对这些参数执行隐式转换,以获得数组的基类型。因此,除非指定每个实参的类型,否则编译器将不得不使用模板实参推导。

和带括号的初始化列表不能被推导出来(在auto变量之外)。因此,在构造每个成员时必须显式地提及类型名称。