2012-02-20 2 views
0

각각 이름과 값이 지정된 여러 형식 유형이 있습니다. 메소드에 매개 변수로 형식 유형을 전달할 수 있기를 원합니다. 선언문은 CreateFile(4,3,2,UGS12_FMT)과 같으며, UGS12_FMT은 C++ 유형입니다.C++ : 클래스 유형을 매개 변수로 사용

매개 변수로 인스턴스를 전달하지 않습니다. 이 작업을 수행하는 방법에 대한 제안 사항은 무엇입니까?

답변

0

이렇게하는 데는 여러 가지 방법이있을 수 있습니다. 가장 권장되는 첫 번째 방법은 앞에서 설명한 것처럼 "이름"과 "값"을 공유하기 때문에 공통 상위 클래스의 각 클래스를 상속하는 것입니다.

당신이 정말로 그것을 "는 CreateFile에"기능에 어떤 클래스를 알고 싶다면, 당신은 더 나은

CreateFile(ClassA a) 
CreateFile(ClassB a) 

대신

CreateFile(Class x) 
    if x is an instance of ClassA 
     doSomething ... 
    else if x is an instance of ClassB 
     doSomething ... 
처럼 여러 기능을 사용하여 기능의 구현 변경할 것
0

당신은 RTTI가 무엇인지보고 싶습니다. 지원은 컴파일러에 따라 다르지만 기본 기능이 있습니다. 시작하기 좋은 곳 here.

예를 들어 GCC의 경우 type_info 개체가 제공하는 이름의 조합을 해제하려면 도우미 함수가 필요합니다.

편집 : 물론 템플릿은 원하는 것을 제공 할 수 없으므로 선호하는 방법이 될 것입니다.

+2

RTTI가 여기에 어떻게 맞는지 알 수 없습니다. – jweyrich

+0

* 템플릿을 사용할 수없고 궁극적으로 유형에 의존하는 작업을해야하는 경우 RTTI 정보 (일반적으로 type_info 맵에서 작동)를 사용하여 조건부로 작업을 수행 할 수 있습니다. 아마도 그렇게 길고 유지하기 어려운 열거 형을 쓸 필요가 없습니다. –

+0

OP가 고려하고있는 파일의 수는 얼마인지 모르지만, 이들 각각을 처리하는 코드를 작성하려면'struct '와 함께'enum'을 유지하는 것이 가장 쉬운 작업입니다.그 외에도,'std :: type_info :: name()'은 컴파일러간에 일관성이 없습니다. 따라서 이식성이 고려된다면, 그것을 기본 죄수로 간주합니다. – jweyrich

1

당신은 정상적인 기능의 인수로 typename에 전달할 수 없습니다, 즉 당신의 조각

using UGS12_FMT = some_type; 
auto file = CreateFile(4,3,2,UGS12_FMT); // error 

가 (당신이 CreateFilestrongly discouraged하는 매크로를 만들 경우를 제외하고) 작동하지 않습니다.

대신 기본적으로 세 가지 대체 기술 중 하나를 사용할 수 있습니다.

  1. 과부하 빈 유형의 서로 다른 인수를 할 수있는 기능 (소위 태그 파견) :

    // declarations of tag types 
    struct format1 {} fmt1; 
    struct format2 {} fmt2; // etc 
    // overloaded file creation functions 
    file_type CreateFile(args, format1); 
    file_type CreateFile(args, format2); 
    // usage: 
    auto file = CreateFile(4,3,2,fmt1); // use format1 
    
  2. 사용하십시오 template (그리고 그것을 전문으로 다른 형식 유형)

    template<typename Format> 
    file_type CreateFile(args); // generic template, not implemented 
    template<> file_type CreateFile<Format1>(args); // one speciliasation 
    template<> file_type CreateFile<Format2>(args); // another speciliasation 
    
    auto file = CreateFile<Format1>(4,3,2); // usage 
    
  3. enum 유형을 사용하여 정보를 전달하십시오.

    enum struct format { 
        f1,    // indicates Format1 
        f2 };    // indicates Format2 
    file_type CreateFile(args,format); 
    
    auto file = CreateFile(4,3,2,format::f1); 
    

마지막으로, 당신은 traits 클래스에게 유사한 기술을 사용하여 이러한 다양한 접근 방식을 결합 할 수 있습니다.

관련 문제