, एक टैग struct
struct tagPosition {};
struct tagDirection {};
struct tagGeneric {};
namespace detail
{
template <typename Tag=tagGeneric>
class Vector3
{
// business as usual
};
}
typedef detail::Vector3<tagPosition> Position;
typedef detail::Vector3<tagDirection> Direction;
typedef detail::Vector3<tagGeneric> Vector3;
बोनस अंक के लिए उपयोग करने पर विचार रूपांतरण ऑपरेटरों/कंस्ट्रक्टर्स है:। आप खतरनाक तरीके से जीने के लिए आप कर सकते हैं पसंद है
template <typename Tag=tagGeneric>
class Vector3
{
template <typename OtherTag>
explicit Vector3(const Vector3<OtherTag>& rhs) { /* ... */ }
// template <typename OtherTag>
// operator Vector3<OtherTag>() const { return /* ... */ }
};
explicit
कीवर्ड ड्रॉप करें, या निहित रूपांतरण ऑपरेटर सक्षम करें। इस तरह के मामलों के लिए स्पष्ट ऑपरेटरों (मुक्त कार्यों :)
परिभाषित करने के लिए
Position pos;
Direction dir;
Generic gen;
dir = gen + pos; // you see why I call it 'promiscuous'?
मैं (बजाय) की सलाह देते हैं: यह बहुत की तरह अनेक ऑपरेटर प्रस्तावों सक्षम करने के लिए सक्षम होने का 'लाभ' के लिए होता है
Position operator+(const Position& v, const Translation& d) { /* .... */ }
इस तरह आपका वर्ग मॉडल आपके वर्गों के अर्थशास्त्र को प्रतिबिंबित करता है।
C++0x would possibly contain things to enable explicit conversion operators, IIRC:
परिवर्तित कंस्ट्रक्टर्स के मामले में, आप निर्माता स्पष्ट रूप N1592 proposal सभी रूपांतरण ऑपरेटरों को इस कीवर्ड के शब्दों में फैला है की घोषणा के द्वारा निहित रूपांतरण अक्षम कर सकते हैं। एक रूपांतरण ऑपरेटर स्पष्ट घोषित किया जाएगा कि एक अंतर्निहित रूपांतरण नहीं करेगा। इसके बजाय, प्रोग्रामर यह स्पष्ट रूप से कॉल करने के लिए होगा
इस के साथ समस्या यह है कि पदों परोक्ष वैक्टर के लिए परिवर्तनीय हैं (और है कि तकनीकी तौर पर, वेक्टर अब एक आभासी नाशक क्रम में सुरक्षित रूप से प्रयोग की जाने वाली होनी चाहिए) – jalf
@jalf है : क्या आभासी विनाशक वास्तव में तब भी जरूरी है जब व्युत्पन्न वर्ग कोई डेटा या विधियां नहीं जोड़ता है? –
आधा: मैं अपने उत्तर में रूपांतरणों के विषय पर चर्चा करता हूं – sehe