如何使用类型特征和概念检测指向算术类型的指针?
如何编写检测指向算术类型的指针的概念?
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
如果我替换*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 限定类型(目前不允许它们)?
根据你如何回答这些问题,这个概念可以进一步调整。