간단한 답은 이전에 보았 듯이 할 수 없습니다.
나는 당신이 정말 원하는 것은이 생각 :
std::map<std::string, Foo> map;
int main()
{
map["bar"] = Foo();
당신은 종종 다음과 같은 예를 볼 수 main()
전에 정말는 실행 초기화를해야하는 경우 :
namespace {
struct StaticInitHelper {
StaticInitHelper() { map["bar"] = Foo(); }
} _helper_obj;
}
을하지만, 지금 map
이 _helper_obj
전에 만들어지지 않는다는 새로운 문제가 있습니다. 이 문제를 해결하는 한 가지 방법은 다음과 같습니다.
namespace {
struct StaticInitHelper : public std::map<std::string, Foo> {
StaticInitHelper() { (*this)["bar"] = Foo(); }
} map;
}
STL 컨테이너 클래스에서 상속하는 것은 일반적으로 권장되지 않습니다. 이 예제는 다른 생성자를 숨기고 STL 기본 클래스에는 가상 소멸자가 없다는 점에 유의하십시오. 이것은 많은 사람들에 의해 "해킹"으로 간주 될 것이므로 반드시 피해야합니다.
는 또 다른 대안은
std::map
으로 클래스를 정의하는 것입니다
는
namespace {
struct StaticInitHelper {
StaticInitHelper() { map["bar"] = Foo(); }
std::map<std::string, Foo> map;
} map_holder;
}
map_holder.map.find(...
그러나 물론이지도의 사용을 복잡하게한다.
업데이트 :
나는 boost::assign
를 사용하여, 다른 옵션을 언급하는 것을 잊었다 :
#include <boost/assign/list_of.hpp>
map<int,int> map = boost::assign::map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);
그래도 난 그 정적 객체에 안전 여부에 대한 정보를 찾을 수 없습니다.
문제는 "글로벌 수준에서 인스턴스화"하지 않고 "글로벌 수준에서 진술을 실행하려고합니다"입니다. 넌 그럴 수 없어, 미안. –