다른 방법이하는 것입니다을 참조하십시오
static void f()
{
static std::map<int, std::unique_ptr<MyClass>> mp = init();
}
호출 : 가 문제를 해결하려면 람다를 사용하십시오. 그것은 별도의 함수를 사용하는 것과 같지만 맵의 초기화를 액션에 가깝게 만듭니다. 이 경우 필자는 &과 decltype의 조합을 사용하여 맵의 이름을 지정하지 않아도되었지만 재미를 위해서입니다.
람다에 전달 된 인수는 호출 시점에서 아직 생성되지 않은 객체에 대한 참조이므로 어떤 식 으로든 참조하지 말아야합니다. 유형 차감에만 사용됩니다.
#include <memory>
#include <map>
#include <utility>
struct MyClass {};
static auto& f()
{
static std::map<int, std::unique_ptr<MyClass>> mp = [](auto& model)
{
auto mp = std::decay_t<decltype(model)> {};
mp.emplace(0, std::make_unique<MyClass>());
mp.emplace(1, std::make_unique<MyClass>());
return mp;
}(mp);
return mp;
}
int main()
{
auto& m = f();
}
다른 방법이 있습니다. 이 경우에 우리는 람다에 일시적으로 전달하고 copy elision/RVO에 의존합니다.
#include <memory>
#include <map>
#include <utility>
struct MyClass {};
static auto& f()
{
static auto mp = [](auto mp)
{
mp.emplace(0, std::make_unique<MyClass>());
mp.emplace(1, std::make_unique<MyClass>());
return mp;
}(std::map<int, std::unique_ptr<MyClass>>{});
return mp;
}
int main()
{
auto& m = f();
}
또 다른 방법으로, 가변 λ에서 람다 캡쳐를 이용하는 것.
#include <memory>
#include <map>
#include <utility>
struct MyClass {};
static auto& f()
{
static auto mp = [mp = std::map<int, std::unique_ptr<MyClass>>{}]() mutable
{
mp.emplace(0, std::make_unique<MyClass>());
mp.emplace(1, std::make_unique<MyClass>());
return std::move(mp);
}();
return mp;
}
int main()
{
auto& m = f();
}
하나의 변수 이름을 입력해야합니다. – Galik