2013-08-23 4 views
6

헤더 파일의 네임 스페이스 내에 클래스가 있습니다. 클래스에는 템플릿 유형이 필요하며 특정 유형 만 사용하면됩니다. 아래는 예를 보여줍니다.네임 스페이스 내의 전용 클래스

파일 a.hpp

// a.hpp 
namespace a_ns { 
template<class T>  
class a { 
    // stuff 
}; 
typedef a<double> a_double; 
} // end of namespace 
// stuff 

파일 b.hpp

// main.cpp 
#include "b.hpp" 
int main() { 
    b_ns::b my_b; // <<<--- I LIKE this! 
    a_ns::a<float> my_a_which_is_not_allowed; // <<<--- I DO NOT LIKE THIS THOUGH! D: 
} 

그래서 당신은 오히려에서 볼 수있는 파일 MAIN.CPP 예를 갈망

// b.hpp 
#include <a.hpp> 
namespace b_ns { 
    typedef a_ns::a_double b; 
} 

의 최종 목적은 일반 사용자가 class afloat으로 선언하도록 허용하지 않는 것입니다. d는 typedef a<double> a_double;으로 선언 된 특정 유형의 사전 정의 된 클래스 만 사용할 수 있습니다.

이 포함되어 있기 때문에 위의 예와 같이 a<float>을 만들 수 있기 때문에 위의 예가 이것을 허용한다고 생각했지만 잘못되었습니다. a.hpp! 그래서 당신은 그 문제를 봅니다! (잘하면?)

이 모든 것이 가능하다면 아마도 간단한 해결책이있을 것입니다. 여기

답변

7

휘발성 아니므로 만 사용하는 유형 별칭을 사용하지 수 있도록하려면이만큼 작동합니다

#include <type_traits> 
template <typename T> 
class X 
{ 
    T i; 
    static_assert(!std::is_same<float,T>::value,"Don't use floating point"); 
}; 



int main() 
{ 
    X<int> a; 
    //X<float> b; fails at compile time 
    return 0; 
} 

static_assert를 사용하는 방법입니다 바로, 당신이 구현 네임 스페이스에 넣어 수 있습니다 a 사용자는 사용하지 알고 있어야한다 :

namespace a_ns { 

namespace detail { 
    template<class T>   
    class a { 
     // stuff 
    }; 
} 

typedef detail::a<double> a_double; 
} // end of namespace 

이제 아무것도을 사용할 수 있습니다을 사용하지만 a을 직접 사용하려면 detail 네임 스페이스를 파고 들어가야하며 일반적으로 그렇게하는 것이 좋지 않습니다. 사용자가이를 원한다고 결정하면 이미 문제를 해결하기 위해 포기하고 포기하지 않도록 추가 조치를 취하지 않아야합니다.

+1

사실 나는 이것을 좋아한다. 프로그래머를 만드는 데 어려움을 겪을 수있는 방법이 없다는 것을 두려워한다. –

+0

@ DieterLücking, 고의적으로 구멍 속으로 자신을 파해야한다는 사실을 알게되면, 그것을 예방하는 것에 대해 훨씬 덜 걱정하게됩니다. 그들이 스스로 망쳐 놓고 싶다면 그들을 내버려 둬라. 거기에 뭔가 도움이 될만한 것이 있다면 적어도 지금은 해킹이 필요하지 않습니다. – chris

+0

또는 Herb Sutter가 다음과 같이 말합니다. Machiavelli가 아니라 Murphy를 방어하십시오. – TemplateRex

관련 문제