【发布时间】:2020-11-07 00:23:48
【问题描述】:
例如,我想使用一个约束来确保函数isinf 是为模板参数T 实现的。如果T 是float、double、long double 或整数类型之一,则可以通过以下方式完成:
#include <cmath>
template <typename T>
concept Test = requires (T a) {
std::isinf(a);
};
但是,我也想将此约束用于自定义的非标准数据类型,我为其实现了自己的 isinf 函数。此函数不包含在 std 命名空间中,因此我尝试了以下操作:
#include <cmath>
template <typename T>
concept Test = requires (T a) {
using std::isinf;
isinf(a);
};
这不起作用,因为 requires 子句中的每个语句都应该是有效的要求,而 using std::isinf 根本不是“要求”。
我看到了解决此问题的两种解决方法:
-
将
using std::isinf;子句移至全局命名空间。但这会将isinf引入全局命名空间,我想避免这种情况。 -
将
using std::isinf;子句与概念定义封装在名为ABC的命名空间中,然后在命名空间后直接添加using ABC::Test;。这似乎有点奇怪。
有没有更好的解决方案?
【问题讨论】:
标签: c++ c++20 c++-concepts argument-dependent-lookup