在此代码中:
// 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;?的冗余专业化)
答案 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}}(也许就是你所需要的全部内容)。