정수 값을 래핑하고이 값이 항상 유효한 범위 내에 있는지 확인하기 위해 C++ 템플릿 클래스를 만들려고합니다. 따라서 간단한 코드는 다음과 같습니다.다른 템플릿 매개 변수를 사용하여 C++ 템플릿간에 암시 적으로 캐스트하는 방법
struct OutOfRangeError
{ };
template<int MIN, int MAX, typename TYPE>
struct IntegerRange
{
private:
TYPE mValue;
public:
IntegerRange(const TYPE value) : mValue(value)
{
if (MIN > value || value > MAX)
{
throw OutOfRangeError();
}
}
operator TYPE() const
{
return mValue;
}
}
이전 코드는 작동하지만이 클래스를 사용하면 약간의 단점이 있습니다. 다음은 샘플입니다
typedef IntegerRange<0, 4, int> range1_t;
typedef IntegerRange<0, 5, int> range2_t;
range1_t a = 3;
//range2_t b = a; // This does not work
range2_t b = static_cast<int>(a); // This works OK
그래서, 내가 명시 적으로 주어진 형식으로 캐스팅 할 다른 범위 사이의 값을 할당 할 수 있습니다. 나는이 명시적인 캐스트를 피하고 IntegerRange 클래스를 다루는 해결책을 일반 정수처럼 사용하고 싶습니다. 따라서 개발자는 클래스 대신 일반 정수를 처리하고 있다는 느낌을 가져야합니다.
이 문제를 해결하기 위해 여러 가지를 시도했습니다. 이 RANGE_TYPE이 형식으로 캐스팅 할 수있는 유형이 될 수 있습니다 나는 너무 많이 좋아하지 않아, 작동하고, 나는이를 제한하고자하는 경우에도, 그러나
template<typename RANGE_TYPE>
IntegerRange(const RANGE_TYPE &value) :
mValue(static_cast<const TYPE>(value))
{
if (MIN > mValue || mValue > MAX)
{
throw OutOfRangeError();
}
}
: 하나의 작업은 생성자에 추가로 다음 하나입니다 IntegerRange 클래스에만 적용됩니다.
template<int ARG_MIN, int ARG_MAX, typename ARG_TYPE>
IntegerRange(const IntegerRange<ARG_MIN, ARG_MAX, typename ARG_TYPE> &value) :
mValue(static_cast<const TYPE>(value))
{
if (MIN > value || value > MAX)
{
throw OutOfRangeError();
}
}
질문 2입니다 :
* 왜 코드의 마지막 조각을 컴파일하고 무엇을하지 않은 경우에만 IntegerRange 클래스로 제한하려면 나는 다음하지만 컴파일되지 않고 나는 이유를 이해하지 못하는 시도 컴파일하기 위해 변경해야합니다.
* 내가 누락 된 명시 적 캐스트를 피하는 것이 더 좋습니까?
감사가 이미 POSIX 숫자 상수로 정의 될 수 있기 때문에 템플릿 이름으로 ARG_MAX
을 사용해서는 안
무엇이 오류 메시지입니까? –
오류 메시지 : 오류 : 'range1_t {aka IntegerRange <0, 4, int>}'에서 gcc의 비 스칼라 유형 'range2_t {aka IntegerRange <0, 5, int>}'로 변환되었습니다. –
전체 코드를 그대로 게시 할 수 있습니까? 나는 그것이 효과가 있어야한다고 생각한다. –