[%]
c++) 복사/이동 불가능한 타입을 맵의 키로 쓰기
PascalC..(pascalcase)
2022-02-22 09:26
추천 5
#include <iostream>
#include <map>
#include <tuple>
struct Foo
{
int a
;
double b
;
Foo(int a
, double b
) : a
{a
}, b
{b
} {}
bool operator<(Foo
const& rhs
) const
{
return std
::tie(a
, b
) < std
::tie(rhs
.a
, rhs
.b
);
}
// un-copyable, un-movable
Foo(Foo
const&) = delete;
Foo(Foo
&&) = delete;
Foo
& operator=(Foo
const&) = delete;
Foo
& operator=(Foo
&&) = delete;
};
struct Bar
{
int a
;
short b
;
short c
;
Bar(int a
, short b
, short c
) : a
{a
}, b
{b
}, c
{c
} {}
};
int main()
{
std
::map
<Foo
, Bar
> m
;
Foo foo
{0, 0.0};
// m.try_emplace(foo, 1, 1, 1); // error
// m.try_emplace(Foo{0, 0.0}, 1, 1, 1); //error
m
.emplace(
std
::piecewise_construct
,
std
::forward_as_tuple(0, 0.0),
std
::forward_as_tuple(1, 1, 1)
);
}
어제 그런 타입 땜에 고생하다가 스택오버플로신의 도움을 받음
일반적인 map 삽입 방식은 복사/이동 생성이 불가능한 타입을 키로 쓰기가 힘듬
try_emplace의 경우 밸류는 컨테이너 내에서 바로 생성 가능하지만 키는 아님
그래서 골치아파하다 emplace에서 piecewise_construct를 사용하면 키도 컨테이너 내에서 생성 가능하다는걸 발견
생긴건 너무 뭐같지만 암튼 가능
try_emplace가 대체로 emplace보다 우월한데 이점에서는 아니라고 함
복사/이동 생성 불가능한 타입을 컨테이너에 담아둘 일이 얼마나 있겠냐만...
이런 방법도 있네
튜플 std::piecewise_construct, std::forward_as_tuple 분명 책에서 본적 있는거 같은데 쓸일이 없어서 이번에 첨 이해하고 써봄 ㅋㅋ
아 튜플이란다 페어
오... - dc App
복사/이동 안되는 키를 쓰는 이유가 뭐임?
외부에서 정의된 타입을 카운팅 해야해서 키로 썼음
키를 랩핑하는건 안되는건가..
그러면 랩핑한 놈도 복사나 이동이 안되자너... 포인터를 랩핑하면 가능하겠지만 그건 만악의 근원
그럼 룩업은 어떻게 하고?
at으로 찾으면 생성과정 없음