实验make_array,我可以使用大括号init列表作为参数
experimental make_array, can I use brace-init list as arguments?
我试图实现一个版本的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
变量之外)。因此,在构造每个成员时必须显式地提及类型名称。
相关文章:
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 为什么基于范围类型的大括号上循环init列表是非法的c++
- 私有变量的读取晚于成员init列表
- 为什么只有一个元素的支撑init列表的类型会切换到元素本身的类型
- 使用支撑的init列表在向量中插入新元素
- 为什么支持的init列表在函数调用和构造函数调用中表现不同
- 调用带有支撑init列表的显式构造函数:是否不明确
- 有没有一种方法可以调用init列表中的成员函数
- 当返回一个用带括号的init列表初始化的对象时,我保证有一对构造函数和析构函数调用吗?
- 它是如何解析的:用带括号的init列表构造未命名的临时对象
- 实验make_array,我可以使用大括号init列表作为参数
- 空的大括号init列表会发出关于缺少字段初始值设定项的警告