C++ std::array的部分模板参数推导或解决方法?
C++17允许我们推导出C++ std::array的部分模板参数推导或解决方法?,c++,templates,c++17,stdarray,C++,Templates,C++17,Stdarray,C++17允许我们推导出std::array的模板参数。例如,我会写字 std::array ints = { 1, 2, 3 }; 而int将是std::array类型 我的问题是:如果我只想指定数组的类型参数,但自动确定数组的大小,该怎么办 以下操作不起作用,因为似乎必须指定所有模板参数: std::array<size_t> sizes = { 1, 2, 3 }; std::数组大小={1,2,3}; 我的编译器抱怨说:“std::array”:模板参数太少 是否可以通
std::array
的模板参数。例如,我会写字
std::array ints = { 1, 2, 3 };
而int
将是std::array
类型
我的问题是:如果我只想指定数组的类型参数,但自动确定数组的大小,该怎么办
以下操作不起作用,因为似乎必须指定所有模板参数:
std::array<size_t> sizes = { 1, 2, 3 };
std::数组大小={1,2,3};
我的编译器抱怨说:“std::array”:模板参数太少
是否可以通过模板参数推断自动确定数组的大小?如果没有,是否可以只指定数组的类型而不指定数组的大小来创建数组?据我所知,这是无法做到的。但是助手方法可以实现以下目的:
template<typename Type, typename ... T>
constexpr auto makeArray(T&&... t) -> std::array<Type, sizeof...(T)>
{
return {{std::forward<T>(t)...}};
}
模板
constexpr自动生成数组(T&&…T)->std::array
{
返回{{std::forward(t)…};
}
用法示例:
const auto container = makeArray<double>(-5.0, 0.0, 5.0, 10.0);
const auto container=makeArray(-5.0,0.0,5.0,10.0);
如果,我可以大胆地详述本杰明的答案。从概念上讲,不需要总是明确地说明结果类型
template<
typename ... T,
typename CT = std::common_type_t< T... >
>
constexpr auto make_array(T&& ... t)
-> std::array< CT , sizeof...(T)>
{
return { { static_cast<CT>( std::forward<T>(t) ) ...} };
}
{
const auto exceptions = make_array(
std::exception{"SE"},
std::runtime_error{"RE"},
std::logic_error{"LE"} );
}
这里的问题可能是,我们并不完全确定我们将得到什么类型的std::array
。只要我们关心它
const auto std_arr = make_array(-5.0, 0, 5.0, 10.0, 42.13f );
在“这里”,使用MSVC,最新的,我得到双打的std数组。如果一个人的床上阅读时间是ISO C++标准文档,那么可以肯定的是,从使用的工具链中,什么类型会从<代码> STD::
对于我们其他人来说,文字后缀会有所帮助
constexpr auto sizes = make_array( 1UL, 2UL, 3UL );
但为什么不谈数字呢?可以将同一层次结构中的实例快速收集到一个数组中。不关心结果类型
template<
typename ... T,
typename CT = std::common_type_t< T... >
>
constexpr auto make_array(T&& ... t)
-> std::array< CT , sizeof...(T)>
{
return { { static_cast<CT>( std::forward<T>(t) ) ...} };
}
{
const auto exceptions = make_array(
std::exception{"SE"},
std::runtime_error{"RE"},
std::logic_error{"LE"} );
}
有点没用,但有点奇怪和美妙。您要记住一件事:这是编译时情况。因此,我可能更喜欢:
constexpr auto sizes = std::array{ 1UL, 2UL, 3UL } ;
直接回答OP的问题
C++20std::to_数组
。对于精确的结果类型和更舒适的使用:
constexpr auto sizes = std::to_array<size_t>({ 0, 1, 3 });
constexpr auto size=std::to_数组({0,1,3});
<> >…< P/>可能的C++副本。参见代码> STD::toyARAY:查看并考虑允许调用者重写。A.,我是一个希望有人提到C++ 20 STD::我的意图不是产生可能与之竞争的实现。