내가 제안하는 해결책은 동적으로 (David Rodriguez - dribeas가 지적한대로) 유형 변환을하는 "중립 유형"을 사용하는 것입니다.
장점 :이 솔루션은 일반적인입니다
- : 새로운 유형을 사용할 때 당신이 그렇게 특별한 것은 필요하지 않습니다.
으로는 성능을
- 안 좋은 단점.
- 삽입 및 추출 스트림 연산자를 정의해야합니다.
코드 :
는
struct Wrapper
{
// get the "neutral type" value
virtual string getValue() const = 0;
template <typename U> Wrapper* clone() const;
};
template <typename T>
struct WrapperT: Wrapper
{
explicit WrapperT(T v): value(v)
{
}
virtual string getValue() const
{
// use streams to conversion to neutral value, but
// other better method would be suitable
ostringstream strm;
strm << value;
return strm.str();
}
T value;
};
template <typename U> Wrapper* Wrapper::clone() const {
U value;
istringstream strm(getValue());
strm >> value;
return new WrapperT<U>(value);
}
편집 : 숫자 만 유형을 사용하는 경우 더 나은 성능의 솔루션을
, 우리는 "중립 형 '으로 long double
에 의해 string
을 변경할 수 있습니다
template <typename T>
double long WrapperT<T>::getValue() const
{
return value;
}
template <typename U> Wrapper* Wrapper::clone() const {
return new WrapperT<U>(getValue());
}
플로팅에 대해 정수형 만 사용할 때 점 변환? 그 경우, 용액은 약간 더 복잡해질 것이다
- 는
U
템플릿에 따라 선택 clone()
기능에서 원하는 getValue()
함수를 두 getValue()
가상 함수 부동 소수점 대 정수 다른 하나씩,
- 을 만들 매개 변수 유형 (대상 유형).
다른 사람이 다음 줄에 't-> 복제()'을 (를) 만들 때 어떤 일이 일어나기를 원하십니까? ('foo'는 완전히 관련이없는 타입입니다.) –
Yakk
변환 구성 자'템플릿은 무엇인가요? explicit WrapperT (const WrapperT &);'? –
jrok
@jrok : 그 생성자는 실제 타입을 알지 못할 것입니다. 그는 포인터를 기초에서 파생 된 유형으로 변환하려고합니다. –