在编译时将参数包转换为数组的简单方法
simple way to convert parameter pack to array at compile time
有没有一种在编译时从参数包创建 std::array
的简单方法?
constexpr auto array = to_array<int>(1, 2, 3, 'a', 5.5f);
现有解决方案:
- 辅助函数和 类 递归:不直观、难以阅读且不是很现代
- C++20 的
std::to_array({...})
:遗憾的是,它仅在所有参数类型都相等时才有效
什么是实现它的简洁方法?
简单的怎么样
template <typename T, typename... Args>
constexpr std::array<T, sizeof...(Args)> to_array (Args && ... args)
{ return {{ std::forward<Args>(args)... }}; }
?
或者,如果您想添加 static_cast
template <typename T, typename... Args>
constexpr std::array<T, sizeof...(Args)> to_array (Args && ... args)
{ return {{ static_cast<T>(std::forward<Args>(args))... }}; }
并使用CTAD和auto
return占位符,可以减少一些打字
template <typename T, typename... Args>
constexpr auto to_array (Args && ... args)
{ return std::array{ static_cast<T>(std::forward<Args>(args))... }; }
有没有一种在编译时从参数包创建 std::array
的简单方法?
constexpr auto array = to_array<int>(1, 2, 3, 'a', 5.5f);
现有解决方案:
- 辅助函数和 类 递归:不直观、难以阅读且不是很现代
- C++20 的
std::to_array({...})
:遗憾的是,它仅在所有参数类型都相等时才有效
什么是实现它的简洁方法?
简单的怎么样
template <typename T, typename... Args>
constexpr std::array<T, sizeof...(Args)> to_array (Args && ... args)
{ return {{ std::forward<Args>(args)... }}; }
?
或者,如果您想添加 static_cast
template <typename T, typename... Args>
constexpr std::array<T, sizeof...(Args)> to_array (Args && ... args)
{ return {{ static_cast<T>(std::forward<Args>(args))... }}; }
并使用CTAD和auto
return占位符,可以减少一些打字
template <typename T, typename... Args>
constexpr auto to_array (Args && ... args)
{ return std::array{ static_cast<T>(std::forward<Args>(args))... }; }