컨테이너에 다른 유형의 템플릿 개체를 저장하는 방법은 무엇입니까?

크리스

내가 가진 가정 할 vector(또는 list또는 무엇이든 용기 여기에 더 적합 할 수 있음) 나는 템플릿 유형의 여러 객체 (또는 포인터)를 저장하고 싶다고 :

std::vector<MyClass<double>> v;
// std::vector<MyClass<double> *> v;

안타깝게도이 컨테이너에 다른 템플릿 객체를 저장하고 싶습니다 (이상적으로 일정한 시간에 액세스해야합니다).

내 첫 번째 직관은 내부적 으로 멤버 변수로 모든 것을 관리하는 일종의 WrapperClass주위 를 만드는 MyClass것이 MyClass었지만 적절한 유형을 MyClass다음 과 같이 전달할 수있는 방법이 명확하지 않습니다 .

#include <iostream>
#include <string>
#include <stdlib.h>
#include <vector>

using namespace std;

template<typename T>
class MyClass
{
public:
    MyClass() {}
    ~MyClass() {}
};

// templating this of course works, but it doesn't solve my problem
template<typename T>
class WrapperClass
{
public:
    WrapperClass()
    {
        m_object = MyClass<T>();
    }

    ~WrapperClass() { }

private:
    MyClass<T> m_object;
};

int main()
{
    WrapperClass<bool> tmp = WrapperClass<bool>();

    std::vector<WrapperClass<bool> *> v;

    return 0;
}

그래서이 (A) 과는 다른 컨테이너가 vector나는이 문제 나에 사용 될 수 있음 (B) 의 종류를 선택하는 방법 MyClassWrapperClass생성자 내부를? 나는 다음과 같은 라인을 따라 무언가를 생각하고 있었다.

class WrapperClass2
{
public:
    WrapperClass2(unsigned int typeId)
    {
        switch (typeId)
        {
            case 0: m_object = new MyClass<bool>();
            case 1: m_object = new MyClass<int>();
            case 2: m_object = new MyClass<float>();
            default: m_object = new MyClass<double>();
        }
    }

    ~WrapperClass2()
    {
        delete m_object;
    }

private:
    MyClass * m_object;
};

또 다른 아이디어는 AbstractType벡터에서 사용할 부모를 갖는 것이지만 템플릿 형식 문제에 어떻게 도움이 될지 모르겠습니다.

마일스 부드 넥

클래스 템플릿의 다른 인스턴스화는 완전히 관련되지 않은 유형이므로 직접 저장하는 컨테이너를 가질 수 없습니다.

몇 가지 옵션이 있습니다.

  1. 클래스 템플릿이 상속하는 일부 기본 클래스에 대한 포인터 컬렉션을 유지합니다.
class Base
{
    virtual ~Base {}
    virtual void someMethod() const = 0;
};
    
template <typename T>
class MyClass : public Base
{
    void someMethod() const
    {
        // stuff
    }
};
    
int main()
{
    std::vector<std::unique_ptr<Base>> objs;
    objs.push_back(std::make_unique<MyClass<int>>());
    objs.push_back(std::make_unique<MyClass<std::string>>());

for (auto i : objs) {
        i->someMethod();
    }
}

이것은 매우 간단한 접근 방식이지만 동적 할당 및 RTTI로 인해 약간의 런타임 오버 헤드가 발생합니다. 또한 무엇인지 모르는 부모 클래스의 메서드이기 때문에 someMethod반환 할 수 없습니다 .TT

  1. 유형이 지워진 래퍼 boost::any(또는 std::anyC ++ 17에서 제공 될 것 )를 사용합니다.
#include <any>
#include <string>
#include <vector>

template <typename T>
class MyClass {
 public:
  T someMethod() const {
    // stuff
    return {};
  }
};

void someFunctionThatTakesInt(int i) {}
void someFunctionThatTakesString(std::string s) {}

int main() {
  std::vector<std::any> objs;
  objs.push_back(MyClass<int>());
  objs.push_back(MyClass<std::string>());

  for (const auto& i : objs) {
    if (i.type() == typeid(MyClass<int>)) {
      auto& mc = std::any_cast<const MyClass<int>&>(i);
      someFunctionThatTakesInt(mc.someMethod());
    } else if (i.type() == typeid(MyClass<std::string>)) {
      auto& mc = std::any_cast<const MyClass<std::string>&>(i);
      someFunctionThatTakesString(mc.someMethod());
    }
  }
}

이 접근 방식은 someMethodreturn 을 가질 수 있음을 의미 T하지만 객체를 사용 vector하기 전에 어떤 유형인지 파악해야하기 때문에 객체 검색을 처리하기가 훨씬 더 어려워집니다 (기본적으로 자체 RTTI를 롤링합니다).

  1. 하지마.

처음에 이것이 필요한 이유를 다시 생각하십시오. 다른 방법이 더 잘 작동 할 수 있습니다. 콜백이나 방문자가있는 것일 수도 있습니다. 나는 여기서 당신의 목표를 모르기 때문에 무엇이 적절한 지 정말로 말할 수 없습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

최신 C ++에서 다른 클래스 유형의 객체를 하나의 컨테이너에 저장하는 방법은 무엇입니까?

분류에서Dev

Azure ARM 템플릿-연결된 템플릿의 출력 변수를 매개 변수로 다른 템플릿에 전달하는 방법은 무엇입니까?

분류에서Dev

Angular NgRx-내 템플릿 HTML의 저장소에서 개체를 보는 방법은 무엇입니까?

분류에서Dev

템플릿 (ShadowDOM)에 포함 된 다른 요소의 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

템플릿 (ShadowDOM)에 포함 된 다른 요소의 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

blazeComponent의 다른 템플릿에서 함수를 호출하는 방법은 무엇입니까?

분류에서Dev

xslt의 다른 템플릿에서 템플릿을 호출하는 방법은 무엇입니까?

분류에서Dev

클래스 템플릿에서 상속되는 템플릿 매개 변수의 기본 템플릿 유형을 확인하는 방법은 무엇입니까?

분류에서Dev

템플릿에서 다른 개체가 연결된 개체를 검색하는 방법은 무엇입니까? 장고

분류에서Dev

템플릿 함수에서 유형에 따라 다른 객체를 구성하는 방법은 무엇입니까?

분류에서Dev

함수 템플릿 내에서 stl 컨테이너를 인식하는 방법은 무엇입니까?

분류에서Dev

AngularJS에서 컨트롤러 + 템플릿에서 다른 컨트롤러 + 템플릿으로 데이터를 전달하는 방법은 무엇입니까?

분류에서Dev

현재 클래스 템플릿을 다른 템플릿의 템플릿 매개 변수로 사용하는 방법은 무엇입니까?

분류에서Dev

Twig 표현식을 매개 변수로 템플릿에 전달한 다음 템플릿의 컨텍스트로 실행하는 방법은 무엇입니까?

분류에서Dev

배열의 개체 요소 수를 다른 배열에 저장하는 방법은 무엇입니까?

분류에서Dev

유형이 아닌 템플릿 매개 변수의 값을 가져 오는 방법은 무엇입니까?

분류에서Dev

컬렉션의 다른 종류의 개체를 기반으로 다른 지시문 템플릿을 호출하는 방법은 무엇입니까?

분류에서Dev

템플릿 인수의 자체 템플릿 인수에 액세스하는 방법은 무엇입니까?

분류에서Dev

다른 플렉스 컨테이너 위에 고정 된 위치로 플렉스 컨테이너를 오버레이하는 방법은 무엇입니까?

분류에서Dev

장고에서 두 개의 템플릿으로 뷰 함수를 연결하는 방법은 무엇입니까?

분류에서Dev

JavaScript에서 appendChild ()를 사용하여 하나의 div 컨테이너를 다른 div 컨테이너에 추가하는 방법은 무엇입니까?

분류에서Dev

동일한 멤버 변수에 다른 특수 템플릿 클래스를 저장하는 방법은 무엇입니까?

분류에서Dev

템플릿 인스턴스를 다른 템플릿의 다른 인스턴스로 전달하는 방법은 무엇입니까?

분류에서Dev

템플릿 유형에서 정적 멤버 초기화를 적용하는 방법은 무엇입니까? 또는 템플릿 유형에서 파생 된 모든 클래스의 수를 얻는 방법은 무엇입니까?

분류에서Dev

다른 테이블의 테이블에 데이터를 저장하는 방법은 무엇입니까?

분류에서Dev

Pyramid의 페이지 템플릿에 개체 배열을 표시하는 방법은 무엇입니까?

분류에서Dev

람다 매개 변수 캡처에 템플릿 형식 정의를 사용하는 방법은 무엇입니까?

분류에서Dev

다른 태그 내에서 Django 템플릿 태그를 사용하는 방법은 무엇입니까?

분류에서Dev

int 유형의 산술 연산 결과를 C ++에서 double 유형 및 다른 유형으로 올바르게 저장하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    최신 C ++에서 다른 클래스 유형의 객체를 하나의 컨테이너에 저장하는 방법은 무엇입니까?

  2. 2

    Azure ARM 템플릿-연결된 템플릿의 출력 변수를 매개 변수로 다른 템플릿에 전달하는 방법은 무엇입니까?

  3. 3

    Angular NgRx-내 템플릿 HTML의 저장소에서 개체를 보는 방법은 무엇입니까?

  4. 4

    템플릿 (ShadowDOM)에 포함 된 다른 요소의 함수를 호출하는 방법은 무엇입니까?

  5. 5

    템플릿 (ShadowDOM)에 포함 된 다른 요소의 함수를 호출하는 방법은 무엇입니까?

  6. 6

    blazeComponent의 다른 템플릿에서 함수를 호출하는 방법은 무엇입니까?

  7. 7

    xslt의 다른 템플릿에서 템플릿을 호출하는 방법은 무엇입니까?

  8. 8

    클래스 템플릿에서 상속되는 템플릿 매개 변수의 기본 템플릿 유형을 확인하는 방법은 무엇입니까?

  9. 9

    템플릿에서 다른 개체가 연결된 개체를 검색하는 방법은 무엇입니까? 장고

  10. 10

    템플릿 함수에서 유형에 따라 다른 객체를 구성하는 방법은 무엇입니까?

  11. 11

    함수 템플릿 내에서 stl 컨테이너를 인식하는 방법은 무엇입니까?

  12. 12

    AngularJS에서 컨트롤러 + 템플릿에서 다른 컨트롤러 + 템플릿으로 데이터를 전달하는 방법은 무엇입니까?

  13. 13

    현재 클래스 템플릿을 다른 템플릿의 템플릿 매개 변수로 사용하는 방법은 무엇입니까?

  14. 14

    Twig 표현식을 매개 변수로 템플릿에 전달한 다음 템플릿의 컨텍스트로 실행하는 방법은 무엇입니까?

  15. 15

    배열의 개체 요소 수를 다른 배열에 저장하는 방법은 무엇입니까?

  16. 16

    유형이 아닌 템플릿 매개 변수의 값을 가져 오는 방법은 무엇입니까?

  17. 17

    컬렉션의 다른 종류의 개체를 기반으로 다른 지시문 템플릿을 호출하는 방법은 무엇입니까?

  18. 18

    템플릿 인수의 자체 템플릿 인수에 액세스하는 방법은 무엇입니까?

  19. 19

    다른 플렉스 컨테이너 위에 고정 된 위치로 플렉스 컨테이너를 오버레이하는 방법은 무엇입니까?

  20. 20

    장고에서 두 개의 템플릿으로 뷰 함수를 연결하는 방법은 무엇입니까?

  21. 21

    JavaScript에서 appendChild ()를 사용하여 하나의 div 컨테이너를 다른 div 컨테이너에 추가하는 방법은 무엇입니까?

  22. 22

    동일한 멤버 변수에 다른 특수 템플릿 클래스를 저장하는 방법은 무엇입니까?

  23. 23

    템플릿 인스턴스를 다른 템플릿의 다른 인스턴스로 전달하는 방법은 무엇입니까?

  24. 24

    템플릿 유형에서 정적 멤버 초기화를 적용하는 방법은 무엇입니까? 또는 템플릿 유형에서 파생 된 모든 클래스의 수를 얻는 방법은 무엇입니까?

  25. 25

    다른 테이블의 테이블에 데이터를 저장하는 방법은 무엇입니까?

  26. 26

    Pyramid의 페이지 템플릿에 개체 배열을 표시하는 방법은 무엇입니까?

  27. 27

    람다 매개 변수 캡처에 템플릿 형식 정의를 사용하는 방법은 무엇입니까?

  28. 28

    다른 태그 내에서 Django 템플릿 태그를 사용하는 방법은 무엇입니까?

  29. 29

    int 유형의 산술 연산 결과를 C ++에서 double 유형 및 다른 유형으로 올바르게 저장하는 방법은 무엇입니까?

뜨겁다태그

보관