2012-05-25 11 views
7

सी ++ में, यदि मेरे पास टेम्पलेट पैरामीटर है, तो मैं एक डिफ़ॉल्ट तर्क को कैसे साफ कर सकता हूं? उदाहरण के लिए, पर विचार करें:क्या टेम्पलेट पैरामीटर का डिफ़ॉल्ट तर्क विशिष्ट हो सकता है?

template <class Key, class Value = int > class Association; 

क्या होगा यदि मैं Value बजाय वर्ग Special के लिए float के लिए डिफ़ॉल्ट करना चाहते हैं? क्या प्रभावी रूप से वर्ग Association को विशेषज्ञता देने का कोई तरीका है कि यदि कुंजी Special है तो वैल्यू डिफ़ॉल्ट रूप से float हो सकती है?

मैं यह करने के एक ही रास्ता लक्षण के साथ होगा कल्पना:

template <class Key> struct Traits { 
    typedef int defaultValue; 
} 
template<> struct Traits<Special> { 
    typedef float defaultValue; 
} 
template <class Key, class Value = Traits<Key>::defaultValue> class Association; 

वहाँ कि इतने शामिल नहीं है और अधिक आसानी से पता चलेगा कि पूर्णांक में सामान्य डिफ़ॉल्ट है ऐसा करने का एक और अधिक संक्षिप्त तरीका है जगह जहां एसोसिएशन परिभाषित किया गया है?

+1

मेरा मानना ​​है कि एक तरह से प्राप्त करने के लिए क्या आप टेम्पलेट उपनाम के साथ चाहते हैं ('using') लेकिन मैं समय की जरूरत नहीं है नहीं होनी चाहिए पता लगाओ – sehe

उत्तर

8

ठीक है, एक नहीं जरूरी-खूबसूरत एक लाइनर:

#include <type_traits> 

template <typename Key, 
      typename Value = typename std::conditional<std::is_same<Key, Special>::value, float, int>::type> 
class Association { /* ... */ }; 
संबंधित मुद्दे