如何使用类型特征和概念检测指向算术类型的指针?

如何编写检测指向算术类型的指针的概念?

template <typename T>
concept arithmetic = std::is_arithmetic<T>::value;

template <typename T>
concept pointer_to_arithmetic = requires (T a) {
    { *a } -> arithmetic;
};

template <typename T>
void fn() {
    printf("failn");
}   

template <pointer_to_arithmetic T>
void fn() {
    printf("passn");
}   

struct s{};

int main() {
    fn<int>();
    fn<int*>();
    fn<s>();
    fn<s*>();
}

我试过上面的,它编译但没有做它应该做的。

预期输出为:

fail
pass
fail
fail

相反,我得到:

fail
fail
fail
fail

如果我替换*aa[0].

回答

对于E复合需求中的表达式,类型约束谓词被输入decltype((E))1

decltype将表达式的值类别编码为它推导出的类型。因为*p是一个左值表达式。推导出的类型适用T&于某些T.

所以你可能想将你的一对概念重写为

template <typename T>
concept arithmetic_ref = std::is_arithmetic<std::remove_reference_t<T>>::value;

template <typename T>
concept pointer_to_arithmetic = requires (T a) {
    { *a } -> arithmetic_ref ;
};

原子谓词可能会更好地命名。


当然,这留下了几个问题。你只是在打字,所以任何类似指针的类型(甚至std::optionaloperator*)都是允许的?或者你只追求基本的指针类型?这个概念应该如何处理 cv 限定类型(目前不允许它们)?

根据你如何回答这些问题,这个概念可以进一步调整。


以上是如何使用类型特征和概念检测指向算术类型的指针?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>