각각 이름과 값이 지정된 여러 형식 유형이 있습니다. 메소드에 매개 변수로 형식 유형을 전달할 수 있기를 원합니다. 선언문은 CreateFile(4,3,2,UGS12_FMT)
과 같으며, UGS12_FMT
은 C++ 유형입니다.C++ : 클래스 유형을 매개 변수로 사용
매개 변수로 인스턴스를 전달하지 않습니다. 이 작업을 수행하는 방법에 대한 제안 사항은 무엇입니까?
각각 이름과 값이 지정된 여러 형식 유형이 있습니다. 메소드에 매개 변수로 형식 유형을 전달할 수 있기를 원합니다. 선언문은 CreateFile(4,3,2,UGS12_FMT)
과 같으며, UGS12_FMT
은 C++ 유형입니다.C++ : 클래스 유형을 매개 변수로 사용
매개 변수로 인스턴스를 전달하지 않습니다. 이 작업을 수행하는 방법에 대한 제안 사항은 무엇입니까?
이렇게하는 데는 여러 가지 방법이있을 수 있습니다. 가장 권장되는 첫 번째 방법은 앞에서 설명한 것처럼 "이름"과 "값"을 공유하기 때문에 공통 상위 클래스의 각 클래스를 상속하는 것입니다.
당신이 정말로 그것을 "는 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 ...
처럼 여러 기능을 사용하여 기능의 구현 변경할 것
당신은 RTTI가 무엇인지보고 싶습니다. 지원은 컴파일러에 따라 다르지만 기본 기능이 있습니다. 시작하기 좋은 곳 here.
예를 들어 GCC의 경우 type_info
개체가 제공하는 이름의 조합을 해제하려면 도우미 함수가 필요합니다.
편집 : 물론 템플릿은 원하는 것을 제공 할 수 없으므로 선호하는 방법이 될 것입니다.
당신은 정상적인 기능의 인수로 typename
에 전달할 수 없습니다, 즉 당신의 조각
using UGS12_FMT = some_type;
auto file = CreateFile(4,3,2,UGS12_FMT); // error
가 (당신이 CreateFile
strongly discouraged하는 매크로를 만들 경우를 제외하고) 작동하지 않습니다.
대신 기본적으로 세 가지 대체 기술 중 하나를 사용할 수 있습니다.
과부하 빈 유형의 서로 다른 인수를 할 수있는 기능 (소위 태그 파견) :
// 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
사용하십시오 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
enum
유형을 사용하여 정보를 전달하십시오.
enum struct format {
f1, // indicates Format1
f2 }; // indicates Format2
file_type CreateFile(args,format);
auto file = CreateFile(4,3,2,format::f1);
마지막으로, 당신은 traits
클래스에게 유사한 기술을 사용하여 이러한 다양한 접근 방식을 결합 할 수 있습니다.
RTTI가 여기에 어떻게 맞는지 알 수 없습니다. – jweyrich
* 템플릿을 사용할 수없고 궁극적으로 유형에 의존하는 작업을해야하는 경우 RTTI 정보 (일반적으로 type_info 맵에서 작동)를 사용하여 조건부로 작업을 수행 할 수 있습니다. 아마도 그렇게 길고 유지하기 어려운 열거 형을 쓸 필요가 없습니다. –
OP가 고려하고있는 파일의 수는 얼마인지 모르지만, 이들 각각을 처리하는 코드를 작성하려면'struct '와 함께'enum'을 유지하는 것이 가장 쉬운 작업입니다.그 외에도,'std :: type_info :: name()'은 컴파일러간에 일관성이 없습니다. 따라서 이식성이 고려된다면, 그것을 기본 죄수로 간주합니다. – jweyrich