如何编写一个 C++ 概念来检查 numeric_limits 是否支持类型

问题描述 投票:0回答:1

我想编写一个 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
时,为什么我会收到此错误?

c++ templates c++-concepts
1个回答
0
投票

该错误是由于在

->
的右侧您需要一个 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; 
© www.soinside.com 2019 - 2024. All rights reserved.