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

Luk*_*sić 4 c++ type-traits c++-concepts c++20

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

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("fail\n");
}   

template <pointer_to_arithmetic T>
void fn() {
    printf("pass\n");
}   

struct s{};

int main() {
    fn<int>();
    fn<int*>();
    fn<s>();
    fn<s*>();
}
Run Code Online (Sandbox Code Playgroud)

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

预期输出为:

fail
pass
fail
fail
Run Code Online (Sandbox Code Playgroud)

相反,我得到:

fail
fail
fail
fail
Run Code Online (Sandbox Code Playgroud)

如果我替换*aa[0].

Sto*_*ica 5

对于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 ;
};
Run Code Online (Sandbox Code Playgroud)

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


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

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