2010-06-17 1 views
0

인터페이스가 double이지만 템플릿 화 된 유형이 동적으로 캐스트되지 않는 클래스는 어떻게 만들 수 있습니까? 시간 실행 얻을인터페이스가 double과 일치하지만 템플릿을 특수화 할 수있는 클래스는 어떻게 만듭니 까?

template<int min_value, int max_value> 
class BoundedDouble: public double {}; 

그리고 템플릿 특수화를 사용

이유는 내가 런타임 타입 시스템을 가지고, 난 그냥 배처럼 작동 유형을 가질 수 있기를 원하는 것입니다 그 유형에 대한 정보 :

template<typename T> 
class Type { etc. } 

template<int min_value, int max_value> 
class Type<BoundedDouble<min_value, max_value>> { int min() const { return min_value; } etc. } 

, 당신이 ... 이중에서 상속 할 수 없습니다

+3

시도하지 마십시오 - 당신은 단지 다른 테이너의 눈이 출혈이 발생할 수 있습니다. 이와 같은 것이 필요한 경우에는 상속이 아닌 composition을 사용하고 명시적인 변환 함수 (예 : ToDouble)를 사용합니다. –

답변

1

당신은 기본 유형에서 파생 수 없습니다. 대신 구성을 사용

#include <cstdlib> 
#include <string> 
#include <stdexcept> 
#include <iostream> 
using namespace std; 

template<typename Type = double, const Type& Min = -10.0, const Type& Max = 10.0> class Bounded 
{ 
public: 
    Bounded() {}; 
    Bounded(const Type& rhs) : val_(rhs) 
    { 
     if(rhs > Max || rhs < Min) 
      throw logic_error("Out Of Bounds"); 
    } 

    operator Type() const 
    { 
     return val_; 
    } 

    Type val_; 
}; 


int main() 
{ 
    typedef Bounded<double, -10.0, 10.0> double_10; 
    double_10 d(-4.2); 
    cout << "d = " << d << "\n"; 
    double d_prime = d; 
    cout << "d_prime = " << d_prime << "\n"; 
    double_10 d2(-42.0); 
    cout << "d2 = " << d << "\n"; 


    return 0; 
} 

출력은 다음과 같습니다

d = -4.2 
d_prime = -4.2 
관련 문제