我想编写一个 C++ 概念来检查
numeric_limits
库是否支持给定类型。我编写了以下代码来执行此操作:
// test.cc
#include <limits>
template<typename T>
concept UsableType = requires(T v)
{
{std::numeric_limits<T>::min()} -> T;
{std::numeric_limits<T>::max()} -> T;
};
template<UsableType T>
class MyClass
{
private:
T val;
public:
void set(T v)
{
val = v;
}
};
int main()
{
MyClass<int> obj;
obj.set(1);
return 0;
}
但是,当我尝试使用
g++ -std=c++23 test.cc
编译它时,我得到了
test.cc:6:44: error: return-type-requirement is not a type-constraint
6 | {std::numeric_limits<T>::min()} -> T;
| ^
test.cc:7:44: error: return-type-requirement is not a type-constraint
7 | {std::numeric_limits<T>::max()} -> T;
| ^
当
numeric_limits
支持int
时,为什么我会收到此错误?
该错误是由于在
->
的右侧您需要一个 concept,而不是类型。这应该编译:
#include <limits>
#include <concepts>
template<typename T>
concept UsableType = requires(T v)
{
{std::numeric_limits<T>::min()} -> std::same_as<T>;
{std::numeric_limits<T>::max()} -> std::same_as<T>;
};
但是,
std::numeric_limits<T>
(及其成员函数min()
和max()
)将存在,无论是否存在任何有意义的专业化(参见在线示例)。使用 std::numeric_limits<T>::is_specialised()
来验证它是否确实具有任何意义。
template <typename T>
concept UsableType = std::numeric_limits<T>::is_specialized;