在下面寻找类似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所示,但会将其延迟到运行时,以寻找编译时评估但已延迟。
谢谢
答案 0 :(得分:0)
不确定您的最终目标是什么,但这是延迟类型特征评估的方法:
#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");
}