如何编写检测指向算术类型的指针的概念?
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::optional
有 operator*
)都是允许的?或者你只追求基本的指针类型?这个概念应该如何对待 cv 限定类型(目前不允许它们)?根据你如何回答这些问题,这个概念可以进一步调整。
关于c++ - 如何使用类型特征和概念检测指向算术类型的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65864208/