클래스 멤버 템플릿 전문화에 다른 액세스 한정자를 설정할 수 있습니까? 코드의 예 (컴파일하지 않음) :
class SimpleClass
{
public:
template <typename T>
void Method();
template <>
void Method<char>();
protected:
template <>
void Method<int>();
protected:
template <>
void Method<float>();
};
Subquestion : 클래스의 템플릿 생성자 전문화에 대해 다른 액세스 수정자를 설정할 수 있습니까? 코드의 예 (컴파일하지 않음) :
class SimpleClass
{
public:
template <typename T>
SimpleClass(T);
template <>
SimpleClass<char>(char);
protected:
template <>
SimpleClass<int>(int);
private:
template <>
SimpleClass<float>(float);
};
클래스 템플릿 멤버 전문화에 다른 액세스 한정자를 설정할 수 있습니까? 코드의 예 (컴파일하지 않음) :
template <typename T>
class ClassTemplate
{
public:
void Method();
template <>
void Method<char>();
protected:
template <>
void Method<int>();
protected:
template <>
void Method<float>();
};
Subquestion : 클래스 템플릿의 생성자 전문화에 대해 다른 액세스 수정자를 설정할 수 있습니까? 코드 예 (컴파일하지 않음) :
template <typename T>
class ClassTemplate
{
public:
ClassTemplate(T);
template <>
ClassTemplate<char>(char);
protected:
template <>
ClassTemplate<int>(int);
private:
template <>
ClassTemplate<float>(float);
};
더 구체적이어야합니다 : 에 ) 1 나는 C ++ (11) 코드 ++와 같은 C 03 해결 방법을 찾고 있어요 :
class SimpleClass
{
public:
template <typename T>
SimpleClass(T);
template <typename T>
void Method();
};
template <>
SimpleClass::SimpleClass<char>(char);
template <>
SimpleClass::SimpleClass<int>(int) = delete;
template <>
void SimpleClass::Method<char>();
template <>
void SimpleClass::Method<int>() = delete;
년 )이 나는 C ++ 다음과 같은 C ++ 11 코드 03 해결 방법을 찾고 있어요 :
template <typename T>
class ClassTemplate
{
public:
ClassTemplate(T);
void Method();
};
template <>
ClassTemplate<char>::ClassTemplate(char);
template <>
ClassTemplate<int>::ClassTemplate(int) = delete;
template <>
void ClassTemplate<char>::Method();
template <>
void ClassTemplate<int>::Method() = delete;
몇 가지 논의에 따라 이전 답변 의 접근 방식을 사용하는 다른 액세스 지정자를 포함한 모든 경우에 대한 완전한 설명이 있습니다.
template <bool C, typename T = void>
using only_if = typename std::enable_if <C, T>::type;
template <typename A, typename B>
using eq = typename std::is_same <A, B>::type;
class SimpleClass1
{
public:
template <typename T, only_if <!eq <T, int>{} && !eq <T, float>{}, int> = 0>
SimpleClass1() { }
protected:
template <typename T, only_if <eq <T, int>{}, int> = 0>
SimpleClass1() { }
protected:
template <typename T, only_if <eq <T, float>{}, int> = 0>
SimpleClass1() { }
};
class SimpleClass2
{
public:
template <typename T, only_if <!eq <T, int>{} && !eq <T, float>{}, int> = 0>
SimpleClass2(T) { }
protected:
template <typename T, only_if <eq <T, int>{}, int> = 0>
SimpleClass2(T) { }
private:
template <typename T, only_if <eq <T, float>{}, int> = 0>
SimpleClass2(T) { }
};
template <typename T>
class ClassTemplate1
{
public:
template <typename U, only_if <!eq <U, int>{} && !eq <U, float>{}, int> = 0>
void Method() { }
protected:
template <typename U, only_if <eq <U, int>{}, int> = 0>
void Method() { }
protected:
template <typename U, only_if <eq <U, float>{}, int> = 0>
void Method() { }
};
template <typename T>
class ClassTemplate2
{
public:
template <typename U, only_if <!eq <U, int>{} && !eq <U, float>{}, int> = 0>
void Method(U) { }
protected:
template <typename U, only_if <eq <U, int>{}, int> = 0>
void Method(U) { }
protected:
template <typename U, only_if <eq <U, float>{}, int> = 0>
void Method(U) { }
};
이 모든 것이 어디에서 유용 할 지 모르겠습니다. :-) 어쨌든 :
나는 모든 생성자 / 메서드 오버로드를 상호 배타적으로 만들어서 까다로울 수있는 다른 액세스 지정자에 대한 애매함과 문제를 방지하기 위해주의를 기울였습니다. 이로 인해 더 많은 유형으로 일반화하기가 더 어려워집니다. 템플릿 별칭은 일반 / 기본 사례 (다른 모든 항목의 보완)에 도움이됩니다.
그러나 이것은 질문에서 설명한 것과 정확히 일치하지 않습니다. 이러한 메서드는 엄격한 형식 동등성을 적용하므로 암시 적 변환을 허용하지 않습니다. std::is_convertible
대신 시도해 볼 수 있지만 모호함에 대한 문을 여는 것입니다.
전체 코드는 그렇게 컴파일되지만 실제로 클래스를 사용하려고하지 않았기 때문에 무슨 일이 일어날 지 모르겠습니다.
SimpleClass1
어떻게 사용할 수 있는지 모르겠습니다 . 기본 생성자에 대한 템플릿 인수를 어떻게 명시 적으로 지정할 수 있습니까 (추론 할 수 없기 때문에)?
코드를 다시 보면 .NET과 ClassTemplate
크게 다르지 않다고 생각합니다 SimpleClass
. ClassTemplate1
모호하기 때문에 기본 템플릿 인수를 가질 수 없습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다