我尝试实现的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变量之外)。因此,在构造每个成员时,您必须明确提及类型名称。

10-06 09:11