Тип Проверка на наличие признаков CRTP Производная, в базовом классе, проблема неопределенного типа - PullRequest
1 голос
/ 05 апреля 2019

В поисках решения, такого как EvalDelay, ниже, чтобы исправить проблему неопределенного типа, EvalDelay - моя попытка решить проблему, но без работы

Поскольку черты проверяются в базовом классе производного, производное все еще не определено. Вопрос в том, какзадержать оценку с помощью какого-то шаблона магии

Проверка черт здесь проста, это просто основа проверки.

 struct Base{};

 template<class T_Type>
 struct T_CheckTrait
 {
    static const bool bVal = std::is_base_of_v<Base, T_Type>;   
  };

template<class TypeToDelay, class T = Next> 
struct EvalDelay
{
    //using type = std::add_volatile<TypeToDelay>;      
    //using type = typename type_identity<TypeToDelay>::type;

    using type = TypeToDelay;
};

 template<class T_Derived>
 struct RexBase
  {
       using T_TypeDly = typename EvalDelay<T_Derived>::type;
       static const bool bVal = T_CheckTrait<T_TypeDly>::bVal;
  };


  struct Rex:RexBase<Rex>{   };

void Main 
    {
    Rex Obj; //and on compilation i get error undefined type, not here but in templates above    

    }

Не компилируется, потому что я пытаюсь проверить черты Rex в его базовом классе во время компиляции.

Ищем магии шаблонов, чтобы задержать оценку

std:: add_volatile задерживает оценку, как показано в EvalDelay, но задерживает ее до времени выполнения, ищет оценку времени компиляции, но задерживается.

Спасибо

1 Ответ

0 голосов
/ 05 апреля 2019

Не знаю, какова ваша конечная цель, но вот как отложить оценку черты типа:

#include <type_traits>

struct Base {};

template<class T>
struct EvalDelay
{
    using type = T;
};

template<class T_Derived>
struct RexBase
{
    using is_base = typename EvalDelay<std::is_base_of<Base, T_Derived>>::type;
};

struct Rex : RexBase<Rex> {   };
struct Rex2 : RexBase<Rex2>, Base {   };

int main()
{
    Rex Obj;
    static_assert(Rex::is_base::value == false, "Rex is not Base");
    static_assert(Rex2::is_base::value == true, "Rex2 is Base");
}

Демонстрационная версия

...