c ++部分特化匹配引用类型

时间:2015-01-08 15:03:20

标签: c++ templates reference partial specialization

在此代码中:

// decomplexify ---------------------------------------------------------------
template <typename T>
struct decomplexify
{
  typedef T type;
};

template <typename ELT>
struct decomplexify<std::complex<ELT> >
{
  typedef ELT type;
};

部分专业化似乎适用于

decomplexify<std::complex<T>>,

但不是

decomplexify<std::complex<T>&>

这是关于gcc(GCC)4.9.2 20141101(Red Hat 4.9.2-1)

这似乎是预期的行为吗?是否有解决方法(除了std :: complex&amp;?的冗余专业化)

1 个答案:

答案 0 :(得分:2)

是的,这种行为是预料之中的。这是一个可行的解决方法:

template <typename T>
struct decomplexify_impl
{
  typedef T type;
};

template <typename ELT>
struct decomplexify_impl<std::complex<ELT> >
{
  typedef ELT type;
};

#include <type_traits>

template<typename T>
struct decomplexify
{
  typedef typename std::remove_reference<T>::type TT;
  typedef typename decomplexify_impl<TT>::type type;
};

如果您不打算使用具有std::complex特化以外类型的类,我建议您保留主模板未定义,以便编译器捕获它并输出错误。

还有value_type std::complex<T> T成员typedef给你{{1}}(也许就是你所需要的全部内容)。