---
# System prepended metadata

title: constructor
tags: [Array]

---

### [<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)    
