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

标签 c++ c++20 typetraits c++-concepts

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

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*>();
}
我试过上面的,它编译但没有做它应该做的。
预期输出为:
fail
pass
fail
fail
相反,我得到:
fail
fail
fail
fail
如果我替换 *a 也不起作用与 a[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 限定类型(目前不允许它们)?
根据你如何回答这些问题,这个概念可以进一步调整。

关于c++ - 如何使用类型特征和概念检测指向算术类型的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65864208/

相关文章:

c++ - std::atomic 和 std::condition_variable 等待、notify_* 方法的区别

c++ - 我如何判断类型是否为仿函数?

c++ - 如何使用索引运算符为容器定义类型特征?

c++ - 如何在 box2d 中进行碰撞连接

c++ - C++20 中两种模块文件(接口(interface)和实现)的意义何在?

c++ - 如何在 if-else 语句中使用 C++20 的可能/不太可能属性

rust - 不满足 `Default` 特征绑定(bind)在标准库所需的类型上

c++ - 无限循环搜索 C++ std::map

c++ - 为什么 INTMAX_MAX 在这里给出错误的结果?

c++ - 从const char arr []转换为char **