Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::array的部分模板参数推导或解决方法?_C++_Templates_C++17_Stdarray - Fatal编程技术网

C++ std::array的部分模板参数推导或解决方法?

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”:模板参数太少 是否可以通

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”:模板参数太少


是否可以通过模板参数推断自动确定数组的大小?如果没有,是否可以只指定数组的类型而不指定数组的大小来创建数组?

据我所知,这是无法做到的。但是助手方法可以实现以下目的:

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++20
std::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::我的意图不是产生可能与之竞争的实现。