Есть класс свойств типа.
//---type select struct---//
template<bool flag,typename T,typename U>
struct Select
{
typedef T SelectedType;
};
template<typename T,typename U>
struct Select<false,T,U>
{
typedef U SelectedType;
};
template<typename U>
struct A_FundamentalTraits
{
typedef null_type fund_type;
enum{isFundamental=false};
};
template<>
struct A_FundamentalTraits<int>
{
typedef int fund_type;
enum{isFundamental=true};
};
template<typename T>
struct A_TypeTraits
{
private:
template<typename U>
struct A_RefTraits
{
enum{isRef=false};
typedef null_type ref_type;
};
template<typename U>
struct A_RefTraits<U&>
{
enum{isRef=true};
typedef U& ref_type;
};
template<typename U>
struct A_ConstRefTraits
{
enum{isCRef=false};
typedef null_type cref_type;
};
template<typename U>
struct A_ConstRefTraits<const U&>
{
enum{isCRef=true};
typedef const U& cref_type;
};
template<typename U>
struct ParameterTraits
{
typedef typename Select<A_FundamentalTraits<U>::isFundamental,U,const U&>::SelectedType ParameterType;
};
template<typename U>
struct ParameterTraits<U&>
{
typedef U& ParameterType;
};
public:
typedef typename A_RefTraits<T>::ref_type ref_type;
enum{isRef=A_RefTraits<T>::isRef};
typedef typename A_ConstRefTraits<T>::cref_type cref_type;
enum{isCRef=A_ConstRefTraits<T>::isCRef};
typedef typename A_FundamentalTraits<T>::fund_type fund_type;
enum{isFundamental=A_FundamentalTraits<T>::isFundamental};
typedef typename ParameterTraits<T>::ParameterType ParameterType;
};
Неправильно определяются типы при передаче в функцию.
template<typename T>
void funcBy(T)
{
std::cout<<"parameter is ref: "<<((client::A_TypeTraits<T>::isRef)?"true":"false")<<std::endl;
std::cout<<"parameter is Cref: "<<((client::A_TypeTraits<T>::isCRef)?"true":"false")<<std::endl;
std::cout<<"parameter is by val: "<<((client::A_TypeTraits<T>::isFundamental)?"true":"false")<<std::endl<<std::endl;
}
A a;
A& ra = a;
funcBy(client::A_TypeTraits<int>::ParameterType());
funcBy(client::A_TypeTraits<A>::ParameterType(a));
funcBy(client::A_TypeTraits<A&>::ParameterType(ra));
Только первый вызов выводит false false true. Остальные 2 выводят только false.
Хотя по отдельности работает правильно
std::cout<<"is ref: "<<((client::A_TypeTraits< client::A_TypeTraits<A&>::ParameterType >::isRef)?"true":"false")<<std::endl;
Выводит true.
В чем дело? Спасибо.