클래스 이름 문자열에서 개체 인스턴스화
C에서는 명시적인 매핑 없이 클래스 이름이 포함된 문자열에서 개체를 인스턴스화하는 것이 불가능합니다. . 이러한 제한은 컴파일 타임에 유형을 알아야 하는 C의 정적 특성에서 비롯됩니다.
옵션 1: 템플릿을 사용한 수동 매핑
템플릿 함수를 생성할 수 있습니다. 인스턴스화하려는 각 클래스와 클래스 이름을 해당 템플릿 함수에 연결하는 맵입니다. 예:
template<typename T> Base* createInstance() { return new T; } map_type map; map["DerivedA"] = &createInstance<DerivedA>; map["DerivedB"] = &createInstance<DerivedB>;
객체를 인스턴스화하려면 다음을 사용합니다.
return map[some_string]();
옵션 2: 런타임 유형 등록
클래스를 가질 수 있습니다. 정적 메커니즘으로 자신을 등록한 다음 인스턴스를 동적으로 검색합니다. 여기에는 클래스 이름을 함수 매핑에 저장하기 위해 싱글톤 맵을 사용하는 것이 포함됩니다. 예는 다음과 같습니다.
struct BaseFactory { static Base * createInstance(std::string const& s) { auto it = getMap()->find(s); return it != getMap()->end() ? it->second() : nullptr; } static std::map<std::string, std::function<Base*()>> * getMap() { if (!map) { map = new std::map<std::string, std::function<Base*()>>; } return map; } private: static std::map<std::string, std::function<Base*()>> * map; }; template<typename T> struct DerivedRegister : BaseFactory { DerivedRegister(std::string const& s) { getMap()->insert({s, &createInstance<T>}); } }; class DerivedB { private: static DerivedRegister<DerivedB> reg("DerivedB"); };
이 방법을 사용하면 런타임 시 클래스 자동 등록이 가능합니다.
옵션 3: Boost Variant
공통 기본 클래스가 없는 관련 없는 클래스의 경우 Boost 변형 라이브러리를 사용할 수 있습니다.
typedef boost::variant<Foo, Bar, Baz> variant_type; template<typename T> variant_type createInstance() { return variant_type(T()); } typedef std::map<std::string, variant_type (*)()> map_type;
이것은 기술을 사용하면 단일 문자열에서 다양한 유형을 인스턴스화할 수 있습니다.
결론적으로 C에는 클래스 이름 문자열에서 객체 인스턴스화를 위한 내장 메커니즘이 부족합니다. 그러나 템플릿, 런타임 등록 또는 Boost 변형 라이브러리를 사용하면 유사한 기능을 얻을 수 있습니다.
위 내용은 클래스 이름 문자열에서 C 개체를 어떻게 인스턴스화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!