C++ c++;20声明为常量的函数的概念检查

C++ c++;20声明为常量的函数的概念检查,c++,constraints,c++20,c++-concepts,C++,Constraints,C++20,C++ Concepts,我想测试c++20中的新概念功能,我想知道是否可以创建一个概念来检查声明为const的函数是否存在。 如果函数的类型正确但不是常量,我希望检查失败。我在这里找不到任何相关信息: 我有这个 模板 概念hasToString=requires(T val){ {val.toString()}/*const在这里给出错误*/->std::与_相同; }; 空f(hasToString自动栏) { std::cout当应用于常量对象参数时,您可以始终检查表达式的格式是否正确 template <t

我想测试c++20中的新概念功能,我想知道是否可以创建一个概念来检查声明为const的函数是否存在。
如果函数的类型正确但不是常量,我希望检查失败。我在这里找不到任何相关信息:

我有这个

模板
概念hasToString=requires(T val){
{val.toString()}/*const在这里给出错误*/->std::与_相同;
};
空f(hasToString自动栏)
{

std::cout当应用于常量对象参数时,您可以始终检查表达式的格式是否正确

template <typename T>
concept hasToString = requires (T val) {
    { std::as_const(val).toString() } -> std::same_as<std::string>;
};
模板
概念hasToString=requires(T val){
{std::as_const(val).toString()}->std::same_as;
};

模板
概念hasToString=requires(T val,T const cval){
{cval.toString()}->std::与相同;
};

添加一个额外的对象参数可能更符合抽象概念需求的定义方式(如果需要表达式检查多个需求的话)。在需要表达式的参数列表中可以有任意多的参数。

您可以使参数
常量

模板
概念hasToString=requires(T const val){
{val.toString()}->std::与相同;
};
概念检查使用模式,因此如果要检查的是调用
const
对象上的成员函数,则需要构造该场景


请注意,这取决于如果
T
恰好是一个引用类型,您希望发生什么。如果您希望这样做:

void f(hasToString auto&&bar)
然后,
T
可能是一个引用类型,如果您仍然希望它真的是
const
,那么您需要将类似
T&
的类型转换为
T const

模板
概念hasToString=requires(std::remove\u reference\u t const val){
{val.toString()}->std::与相同;
};

但是如果你做了足够的次数,你可以考虑添加别名模板来处理它。

你可能想指出如果<代码> t>代码>是一个引用类型会发生什么。第一个版本把<代码> const <代码>下。第二个版本忽略了<代码> const 。@ HTNW -巴里有一个很好的答案。对于少数例外情况,答案多样性是SO的一个优势。
template <typename T>
concept hasToString = requires (T val, T const cval) {
    { cval.toString() } -> std::same_as<std::string>;
};