gpt4 book ai didi

c++ - 如何使用模板找到参数 T 的最大可解引用级别

转载 作者:行者123 更新时间:2023-12-01 14:38:48 24 4
gpt4 key购买 nike

为了好玩,我正在设计一个“取消引用器”类。

我写了一些structalias 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 tuple - calling a function on each element ,但我无法画出具体的图。

这是我尝试过的:

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;

但它不起作用...(编译器说 ma​​x 不是 tje 类的成员)出了什么问题?

最佳答案

这是直接使用 SFINAE 的递归实现:

template <class T, class = void>
struct deref_level {
enum : std::size_t { value = 0 };
};

template <class T>
struct deref_level<T, decltype(void(*std::declval<T const &>()))> {
enum : std::size_t { value = deref_level<decltype(*std::declval<T const &>())>::value + 1 };
};

See it live on Wandbox

关于c++ - 如何使用模板找到参数 T 的最大可解引用级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63790578/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com