이것은 약간의 OT이지만 다른 사람을 도울 경우를 대비하여 여기에 남겨 둘 것이라고 생각했습니다. 나는 나를 여기로 이끈 템플릿 전문화에 대해 인터넷 검색을하고 있었고 @ maxim1000의 대답은 정확하고 궁극적으로 내 문제를 파악하는 데 도움이되었지만 충분히 명확하다고 생각하지 않았습니다.
내 상황은 OP와 약간 다릅니다 (그러나이 대답을 떠날만큼 충분히 유사합니다). 기본적으로 "상태 유형"을 정의하는 모든 종류의 클래스와 함께 타사 라이브러리를 사용하고 있습니다. 이러한 유형의 핵심은 단순히 enum
s이지만 클래스는 모두 공통 (추상) 부모에서 상속되며 연산자 오버로딩 및 함수와 같은 다른 유틸리티 함수를 제공 static toString(enum type)
합니다. 각 상태 enum
는 서로 다르며 관련이 없습니다. 예를 들어, 하나 enum
에는 필드가 NORMAL, DEGRADED, INOPERABLE
있고 다른 하나 에는 AVAILBLE, PENDING, MISSING
등이 있습니다. 내 소프트웨어는 서로 다른 구성 요소에 대해 서로 다른 유형의 상태를 관리합니다. toString
이러한 기능 을 활용하고 싶었다는 생각이 들었습니다.enum
클래스이지만 추상적이기 때문에 직접 인스턴스화 할 수 없습니다. 사용하고 싶은 각 수업을 확장 할 수 있었지만 궁극적으로 내가 신경 쓰는 구체적인 상태가 되는 template
수업 을 만들기로 결정했습니다 . 아마도 그 결정에 대해 약간의 논쟁이있을 수 있지만, 각 추상 클래스를 내 자신의 사용자 정의 클래스로 확장 하고 추상 함수를 구현하는 것보다 훨씬 적은 작업이라고 느꼈습니다 . 물론 내 코드에서 .NET의 문자열 표현 을 호출 하고 인쇄 할 수 있기를 원 했습니다 . 모든 s는 전혀 관련이 없었기 때문에 각각 고유 한typename
enum
enum
.toString(enum type)
enum
enum
toString
(내가 배운 몇 가지 연구 후) 템플릿 전문화를 사용하여 호출해야했던 함수. 그것은 나를 여기로 이끌었습니다. 다음은이 작업을 올바르게 수행하기 위해 수행해야하는 MCVE입니다. 그리고 실제로 내 솔루션은 @ maxim1000과 약간 다릅니다.
이것은 s에 대한 (매우 단순화 된) 헤더 파일입니다 enum
. 실제로 각 enum
클래스는 자체 파일에 정의되어 있습니다. 이 파일은 내가 사용중인 라이브러리의 일부로 제공되는 헤더 파일을 나타냅니다.
#include <string>
class Enum1
{
public:
enum EnumerationItem
{
BEARS1,
BEARS2,
BEARS3
};
static std::string toString(EnumerationItem e)
{
}
};
class Enum2
{
public:
enum EnumerationItem
{
TIGERS1,
TIGERS2,
TIGERS3
};
static std::string toString(EnumerationItem e)
{
}
};
다음 파일을 다른 코드 블록으로 분리하기 위해이 줄을 추가합니다.
#include <string>
template <typename T>
class TemplateExample
{
public:
TemplateExample(T t);
virtual ~TemplateExample();
std::string toString();
private:
T type_;
};
template <typename T>
TemplateExample<T>::TemplateExample(T t)
: type_(t)
{
}
template <typename T>
TemplateExample<T>::~TemplateExample()
{
}
다음 파일
#include <string>
#include "enums.h"
#include "TemplateExample.h"
template <>
std::string TemplateExample<Enum1::EnumerationItem>::toString()
{
return Enum1::toString(type_);
}
template <>
std::string TemplateExample<Enum2::EnumerationItem>::toString()
{
return Enum2::toString(type_);
}
다음 파일
#include <iostream>
#include "TemplateExample.h"
#include "enums.h"
int main()
{
TemplateExample<Enum1::EnumerationItem> t1(Enum1::EnumerationItem::BEARS1);
TemplateExample<Enum2::EnumerationItem> t2(Enum2::EnumerationItem::TIGERS3);
std::cout << t1.toString() << std::endl;
std::cout << t2.toString() << std::endl;
return 0;
}
그리고 이것은 다음을 출력합니다.
BEARS1
TIGERS3
이것이 내 문제를 해결하는 이상적인 솔루션인지는 알 수 없지만 저에게 효과적이었습니다. 이제 얼마나 많은 열거 형을 사용하든 상관없이 toString
.cpp 파일 의 메서드에 대해 몇 줄을 추가하기 만하면됩니다. 라이브러리에서 이미 정의 된 toString
메서드를 직접 구현하지 않고 각각을 확장하지 않고도 사용할 수 있습니다. enum
사용하고 싶은 수업.