Modern C++ Design ParameterType
От: Аноним  
Дата: 07.10.12 18:29
Оценка:
Есть класс свойств типа.

//---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.

В чем дело? Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.