반응형
std :: array에 배열을 채울 값을 취하는 생성자가없는 이유는 무엇입니까?
부재입니다
std::array<T,size>::array(const T& value);
감독? 나에게 매우 유용 해 보이며 동적 컨테이너 (예 std::vector
:)에는 유사한 생성자가 있습니다.
나는 완전히 알고있다
std::array<T,size>::fill(const T& value);
그러나 그것은 생성자가 아니며 메모리가 먼저 제로화됩니다. 내가 모두를 원하는 경우는 -1
'같은이야 이 사람 ?
std::array
의도적으로 집계이므로 사용자가 선언 한 생성자가 없습니다.
말했듯이 fill
기본 구성 후에 사용할 수 있습니다 . 집계이기 때문에 기본 생성은 메모리를 0으로 만들지 않지만 초기화되지 않은 상태로 둡니다 (포함 된 유형이 사소하게 초기화 가능한 경우).
배열이 0으로 초기화되지 않고 복사 생성자가 있고 수행한다는 사실을 활용하여 이러한 유형의 생성자를 효율적으로 시뮬레이션 할 수 있습니다.
template <size_t N, class T>
array<T,N> make_array(const T &v) {
array<T,N> ret;
ret.fill(v);
return ret;
}
auto a = make_array<20>('z');
우선, 그것은 아니고 std::array<T>
, 컴파일 시간 상수 적분 표현식 이 std::array<T,N>
있는 곳 N
입니다.
둘째, std::array
의도적으로 집계됩니다. 따라서 집계되지 않는 것이 없으므로 생성자와 소멸자, 가상 함수 등이 없습니다.
다음을 사용할 수 있습니다 std::index sequence
.
namespace detail
{
template <typename T, std::size_t...Is>
constexpr std::array<T, sizeof...(Is)>
make_array(const T& value, std::index_sequence<Is...>)
{
return {{(static_cast<void>(Is), value)...}};
}
}
template <std::size_t N, typename T>
constexpr std::array<T, N> make_array(const T& value)
{
return detail::make_array(value, std::make_index_sequence<N>());
}
std::make_index_sequence
C ++ 14이지만 C ++ 11로 구현할 수 있습니다.
static_cast<void>(Is)
제공 operator,
할 T
수있는 악을 처리 하는 것입니다.
반응형
'program tip' 카테고리의 다른 글
bash 스크립트에서 32 비트와 64 비트를 감지 할 수 있습니까? (0) | 2020.11.03 |
---|---|
fb : app_id 또는 fb : admins는 언제 필요합니까? (0) | 2020.11.02 |
Python에서 QR 코드 이미지를 디코딩하는 방법은 무엇입니까? (0) | 2020.11.02 |
PHP DateTime 마이크로 초는 항상 0을 반환합니다. (0) | 2020.11.02 |
인터페이스의 명시 적 구현이 공개 될 수없는 이유는 무엇입니까? (0) | 2020.11.02 |