c++20对声明为const的函数进行概念检查



我想测试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>;
};

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

当应用于const对象参数时,您可以始终检查表达式的格式是否正确。

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

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

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

最新更新