클래스 멤버 템플릿 전문화 (및 클래스 템플릿 멤버 전문화)에 대해 다른 액세스 수정자를 설정할 수 있습니까?

건설자
  1. 클래스 멤버 템플릿 전문화에 다른 액세스 한정자를 설정할 수 있습니까? 코드의 예 (컴파일하지 않음) :

    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);
      };
      
  2. 클래스 템플릿 멤버 전문화에 다른 액세스 한정자를 설정할 수 있습니까? 코드의 예 (컴파일하지 않음) :

    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;
iavr

몇 가지 논의에 따라 이전 답변 의 접근 방식을 사용하는 다른 액세스 지정자를 포함한 모든 경우에 대한 완전한 설명이 있습니다.

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관