c++20 函数被声明为 const 的概念检查

标签 c++ constraints c++20 c++-concepts

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

我有这个

template <typename T>
concept hasToString = requires (T val) {
    { val.toString() } /* const here gives error */ -> std::same_as<std::string>;
};

void f(hasToString auto bar)
{
    std::cout << bar.toString();
}

最佳答案

你可以使参数const:

template <typename T>
concept hasToString = requires (T const val) {
    { val.toString() } -> std::same_as<std::string>;
};

概念检查使用模式,因此如果您要检查的是在 const 对象上调用成员函数,则需要构建该场景。


请注意,如果 T 恰好是引用类型,这取决于您希望发生什么。如果你想让它工作:

void f(hasToString auto&& bar)

那么T可能是一个引用类型,如果你仍然希望它真的是const,那么你需要转一个像T&这样的类型> 进入 T const。漫长的写法是:

template <typename T>
concept hasToString = requires (std::remove_reference_t<T> const val) {
    { val.toString() } -> std::same_as<std::string>;
};

但如果你这样做的次数足够多,你可以考虑添加一个别名模板来处理它。

关于c++20 函数被声明为 const 的概念检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65583576/

相关文章:

c# - 使用反射调用具有约束的泛型方法

eclipse-cdt - Eclipse CDT C++20 支持

c++ - string_view 和 basic_string<char> 有什么联系,为什么 string_view 示例代码不起作用?

android - 错误 :(289, 23)C++/JNI/NDK - 错误:无法使用 'char *' 类型的左值(又名 'jstring')初始化 '_jstring *' 类型的参数

c++ - 使用来自元函数的 typedef 声明成员函数

python - OpenErp - 外部 ID 批量更新

swift - 使用编程约束和@IBDesignable时设计时崩溃

c++ - 需要特定参数包大小的C++模板概念

c++ - 密封类实现查询

c++ - vector 不能被覆盖