我正在设计一个“取消引用”类,为了好玩。
我写了一些struct
s 和alias
s :
template <class _T>
using deref_type = decltype(*std::declval<_T>());
template <class _T, class _SFINAE>
struct is_derefable : std::false_type {};
template <class _T>
struct is_derefable< _T, deref_type<_T> > : std::true_type
{
using return_type = deref_type<_T>;
};
template<class _T>
using check_derefable = is_derefable<T, deref_type<T>>;
假设有一个类型为 的变量T = std::vector<int**>::iterator
,它是被解引用到 2 级指针的迭代器,因此具有 3 级可解引用性。
在这里,我想知道T
在编译时任意类型的“可取消引用”的最大级别。
std::cout << deref_level<std::vector<int**>::iterator>::max << std::endl; // this should prints 3
我认为这类似于在编译时生成一个序列:模板元组 - 在每个元素上调用一个函数 ,但我无法画出具体的图片。
这是我尝试过的:
template<class _TF, class _T>
struct derefability {};
template<int _N, class _derefability>
struct deref_level;
template<int _N, class _T>
struct deref_level<_N, derefability<std::false_type, _T>>
{
static const int max = _N;
};
template<int _N, class _T>
struct deref_level<_N, derefability<std::true_type, _T>> :
deref_level<_N + 1, derefability<typename check_derefable<deref_type<_T>>::type, deref_type<_T>>>{};
deref_level<0, derefability<check_derefable<T>::type, T>::max;
但它不起作用......(编译器说max不是 tje 类的成员)出了什么问题?