如何指定std::array元素类型同时推导数组大小(部分CTAD)
实现仅指定一次元素类型并推导std::array大小的方法
C++20 解决方案:使用std::to_array
C++20引入的std::to_array刚好匹配需求:只需指定一次Element类型,编译器会自动推导数组大小,初始化列表里的元素也不用重复显式声明类型。
示例代码:
using Element = std::array<int, 2>; constexpr auto arrayOfElement() { return std::to_array<Element>( { {1, 2}, {2, 3}, {123, 123}, {8008, 1337} } ); }
这里std::to_array<Element>明确了数组的元素类型,括号内的聚合初始化列表直接构造每个Element实例,数组大小由初始化元素的数量自动推导。
C++17 及更早版本:自定义辅助函数
如果需要兼容C++17或更早版本,可以自己实现一个简单的模板辅助函数,达到同样效果:
using Element = std::array<int, 2>; template<typename T, typename... Args> constexpr auto make_array_of(Args&&... args) -> std::array<T, sizeof...(Args)> { return {std::forward<Args>(args)...}; } constexpr auto arrayOfElement() { return make_array_of<Element>( {1, 2}, {2, 3}, {123, 123}, {8008, 1337} ); }
这个make_array_of模板函数接受明确的元素类型T(传入Element)和任意数量的初始化参数,返回对应大小的std::array<T, N>,其中N由参数个数sizeof...(Args)推导得出。初始化时同样可以直接用聚合语法,无需重复写Element。
内容的提问来源于stack exchange,提问作者Andreas Loanjoe
相关产品推荐
相关产品推荐

