Fal*_*Ger 2 c++ constraints c++-concepts c++20
我想测试 c++20 中的新概念功能,我想知道是否可以创建一个概念来检查声明为 const 的函数是否存在。
如果函数以正确的类型存在但不是 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();
}
Run Code Online (Sandbox Code Playgroud)
您可以设置参数const:
template <typename T>
concept hasToString = requires (T const val) {
{ val.toString() } -> std::same_as<std::string>;
};
Run Code Online (Sandbox Code Playgroud)
概念检查使用模式,因此如果您要检查的是在const对象上调用成员函数,则需要构建该场景。
请注意,如果T恰好是引用类型,这取决于您想要发生的情况。如果你想让这个工作:
void f(hasToString auto&& bar)
Run Code Online (Sandbox Code Playgroud)
那么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>;
};
Run Code Online (Sandbox Code Playgroud)
但是如果你这样做足够多,你可以考虑添加一个别名模板来处理它。