2012-05-25 78 views
7

在C++中,如果我有一个模板参数,我该如何干净地专门化一个默认参数?例如,考虑以下因素:模板参数的默认参数是否可以专用?

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

如果我想Value,而不是默认floatSpecial类?有没有一种方法实际上专门化类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; 

是否有这样做的更简洁的方式,是不是这样参与进来,会更容易显示,int是正常的默认在协会定义的地方?

+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 { /* ... */ };