【问题标题】:Can a template parameter's default argument be specialized?模板参数的默认参数可以特化吗?
【发布时间】:2012-06-01 02:58:59
【问题描述】:

在 C++ 中,如果我有一个模板参数,我怎样才能干净地专门化一个默认参数?例如,考虑以下情况:

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

如果我希望 Value 改为默认为 floatSpecial 怎么办?有没有一种方法可以有效地专门化 Association 类,如果 Key 是 Special,那么 Value 默认是 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 是定义 Association 的地方的正常默认值?

【问题讨论】:

  • 我相信应该有一种方法可以通过模板别名 (using) 实现您想要的,但我没有时间弄清楚

标签: c++ templates template-specialization traits


【解决方案1】:

好吧,一个不一定更漂亮的单线:

#include <type_traits>

template <typename Key,
          typename Value = typename std::conditional<std::is_same<Key, Special>::value, float, int>::type>
class Association { /* ... */ };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多