我尝试实现的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)...}};
}
答案 0 :(得分:0)
make_array
是一个可变参数模板函数,它接受任何类型的参数。然后,它将对这些参数执行隐式转换,以获得阵列的基本类型。因此,除非指定每个参数的类型,否则编译器必须使用模板参数推导。
无法推断出braced-init-lists(auto
变量之外)。因此,在构造每个成员时,您必须明确提及类型名称。