¿Puede C++ generar un error cuando la inicialización de la matriz estándar es demasiado pequeña?
gcc stdarray (3)
Supongamos que tengo una serie de:
std::array<int, 6> {4,3,2};
¿Es posible generar un error o advertencia cuando este es el caso? En algunos casos, puede ser útil tener esta coincidencia explícita.
En lugar de escribir su propio método createArray, puede usar std::make_array
si tu compilador lo admite.
#include <experimental/array>
int main()
{
std::array<int,5> arr1= std::experimental::make_array(1, 2, 3, 4, 5); // ok
std::array<int,3> arr2= std::experimental::make_array(1, 2, 3, 4, 5); // fails
std::array<int,6> arr3= std::experimental::make_array(1, 2, 3, 4, 5); // fails
}
Pero todos pueden iniciar directamente la matriz a través del constructor. Por lo tanto, no hay garantía para su base de código si no verifica (automáticamente) contra algunas pautas de codificación.
Puede crear su propia capa de abstracción que se queja cuando no pasa exactamente el mismo número de argumentos para la inicialización.
template <std::size_t N, class ...Args>
auto createArray(Args&&... values)
{
static_assert(sizeof...(values) == N);
using First = std::tuple_element_t<0, std::tuple<Args...>>;
return std::array<First, N>{values...};
}
Para ser invocado como
auto ok = createArray<6>(4, 3, 2, 1, 0, -1);
auto notOk = createArray<6>(4, 3, 2};
Puede usar
std::make_array
o algo similar para hacer que los tipos difieran
std::array<int, 6> = std::make_array(4,3,2);
da este error en gcc:
<source>:30:53: error: conversion from ''array<[...],3>'' to non-scalar type ''array<[...],6>'' requested