### [<i class="fa fa-fw fa-home"></i>](../../README.md)/[quiet](../quiet.md)/[Array](Array.md)/constructor
# quiet::Array::constructor
``` C++=
template<size_t N = N, class _Ty1 = T, class ..._Ty2>
requires requires
{
requires sizeof...(_Ty2) == N;
requires convertible_from_and<_Ty1, _Ty2...>;
}
constexpr Array(_Ty2... t) :
std::array<_Ty1, N>({ static_cast<_Ty1>(t)... }) {}
template<size_t N = N, class _Ty1 = T, class ..._Ty2>
requires requires
{
requires N_Array::args_size<_Ty1, _Ty2...> == N;
requires convertible_from_nand<_Ty1, _Ty2...>;
}
constexpr Array(_Ty2... t) :
std::array<_Ty1, N>({ N_Tuple::I_Apply_Action<std::array<_Ty1, N>, _Ty2...>::Apply(t...) }) {}
template<size_t N = N, class _Ty1 = T, class ..._Ty2>
requires requires
{
requires !(N_Array::args_size<_Ty1, _Ty2...> <= 0);
requires !(N_Array::args_size<_Ty1, _Ty2...> >= N);
_Ty1{};
}
explicit constexpr Array(_Ty2 ...t) :
std::array<_Ty1, N>({ N_Tuple::I_Apply_Action<std::array<_Ty1, N>, _Ty2...>::Apply(t...) }) {}
template<size_t N = N, class _Ty1 = T>
requires requires
{
_Ty1{};
}
explicit constexpr Array() :
std::array<_Ty1, N>({}) {}
```
## 概要
### `Array`を以下の条件にて初期化をする。
1. `T`と互換性がある型を`N`個の場合
1. [`N_Array::args_size<_Ty1, _Ty2...>`](N_Array/args_size.md)が`N`と一致する場合
1. [`N_Array::args_size<_Ty1, _Ty2...>`](N_Array/args_size.md)が`N`より小さい、かつ`T`がデフォルト構築可能な場合
1. `T`がデフォルト構築可能な場合
## 備考
* `条件2`,`条件3`は[`N_Tuple::I_Apply_Action`](../Tuple/Apply_Action.md)にて`_Ty2...`を適切に変換し、`std::array`を構築する
## 例
```
#include"Array.h"
using namespace quiet;
int main()
{
Array<int, 3> ary_int3_1(1, 2.0f, 3.0);//[1, 2.0f, 3.0]->[1,2,3]
Array<int, 3> ary_int3_2(1);//[1]->[1,int{},int{}]->[1,0,0]
//Array<int, 3> ary_int3_3(1, 2.0f, 3.0,4);//引数が多い為、エラー
Array<float,3> ary_float3_1(ary_int3_1);//[1,2,3]->[1.0f,2.0f,3.0f]
Array<double, 9> ary_double9_1(ary_int3_1, ary_float3_1, 7, 8.0f, 9.0);//[1,2,3,1.0f,2.0f,3.0f,7,8.0f,9.0]->[1.0,2.0,3.0,1.0,2.0,3.0,7.0,8.0,9.0]
Array<Array<int,3>, 3> ary_int33_1(ary_int3_1, ary_float3_1, 7, 8.0f, 9.0); //[1, 2, 3, 1.0f, 2.0f, 3.0f, 7, 8.0f, 9.0] ->[[1, 2, 3],[1, 2, 3],[7, 8, 9]]
Array<Array<int,3>, 2> ary_int32_1(ary_int3_1);//[1, 2, 3] ->[[1, 2, 3],[int{},int{},int{}]]->[[1, 2, 3],[0,0,0]]
//Array<Array<int,3>, 2> ary_int32_2(ary_int3_1,0);//[int]から Array<int,3>へ変換しようとするが、デフォルト構築を伴う暗黙的な型変換は、禁止されている為エラーとなる
Array<int,6> ary_int6_1(ary_int3_1,0);//似たような場合だが、上記と異なり[int]から Array<int,3>へ変換が行われない為、可となる
return 0;
}
```
## 関連
[Array](Array.md)
[N_Array::args_size](N_Array/args_size.md)