>백엔드 개발 >C++ >클래스 이름 문자열에서 C 개체를 어떻게 인스턴스화할 수 있습니까?

클래스 이름 문자열에서 C 개체를 어떻게 인스턴스화할 수 있습니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-18 00:25:10505검색

How Can I Instantiate C   Objects from Class Name Strings?

클래스 이름 문자열에서 개체 인스턴스화

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.