2015-01-08 4 views
0

В этом коде:с ++ частичное соответствие специализации ссылочного типа

// 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 &?)

ответ

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 член typedef std::complex<T>, который дает вам T (возможно, это все, что вам нужно).

+0

очень приятно, спасибо! В этом случае результирующий тип удалил бы ссылку, которая, я думаю, и есть то, что я хочу. Но только для любопытства, есть ли решение, которое сохранит ссылку? 'decplexify &> :: type == double &'? – nbecker

Смежные вопросы