2012-05-25 35 views
7

Trong C++, nếu tôi có tham số mẫu, làm thế nào tôi có thể làm sạch một đối số mặc định? Ví dụ, hãy xem xét những điều sau đây:Đối số mặc định của tham số mẫu có thể chuyên biệt không?

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

gì nếu tôi muốn Value để thay mặc định float cho lớp Special? Có cách nào để có hiệu lực chuyên lớp Association sao cho nếu Khóa là Special giá trị mặc định là thay thế là float?

Tôi tưởng tượng một cách để làm điều này sẽ là với những đặc điểm:

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; 

Có một cách gọn gàng hơn để làm điều này mà không phải là quá tham gia và sẽ dễ dàng hơn cho thấy rằng int là mặc định bình thường tại nơi Hiệp hội được xác định?

+1

tôi tin rằng cần phải có một cách để đạt được những gì bạn muốn với mẫu bí danh ('using') nhưng tôi không có thời gian để tìm ra – sehe

Trả lời

8

Vâng, một không-hẳn-đẹp hơn một liner:

#include <type_traits> 

template <typename Key, 
      typename Value = typename std::conditional<std::is_same<Key, Special>::value, float, int>::type> 
class Association { /* ... */ }; 
Các vấn đề liên quan