【问题标题】:Template specialization for fundamental types基本类型的模板特化
【发布时间】:2017-07-21 18:50:29
【问题描述】:

有没有办法只为基本类型制作模板特化? 我已尝试执行以下操作:

template<typename T, typename = typename std::enable_if<!std::is_fundamental<T>::value>::type>
class foo
{
}

template<typename T, typename = typename std::enable_if<std::is_fundamental<T>::value>::type>
class foo
{
}

但是我收到了一个模板已经定义的错误。

【问题讨论】:

  • @EdgarRokyan 不是骗子;一个处理函数,这个处理类
  • @Justin 但原理应该是一样的吧?
  • @EdgarRokyan 一点也不。
  • @EdgarRokyan 除了部分特化之外,它们是相同的,这对于函数是不允许的。

标签: c++ templates metaprogramming generic-programming


【解决方案1】:

在这里,您正在创建两个具有相同名称的模板类,而不是特化类。

你需要创建一个通用的然后专门化它:

// not specialized template (for non-fundamental types), Enabler will 
// be used to specialize for fundamental types
template <class T, class Enabler = void>
class foo { };

// specialization for fundamental types
template <class T>
class foo<T, std::enable_if_t<std::is_fundamental<T>::value>> { };

【讨论】:

  • 真的需要专攻!is_fundamental吗?您可以只使用主模板。
  • 我正在使用 shared_ptrs 的主模板,我正在构建一个用于存储无锁值的模式。
  • @Rakete1111 不,这里没有意义,我只是继续使用 OP 的代码。我已经更新了答案,谢谢。
  • @AndreasLoanjoe Rakete1111 的意思是您可以为非基本类型使用非专业模板,为基本类型使用专业模板。您不需要专门针对两者,请参阅我的更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多