#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보다 우월한데 이점에서는 아니라고 함

복사/이동 생성 불가능한 타입을 컨테이너에 담아둘 일이 얼마나 있겠냐만...