c++20 函数被声明为 const 的概念检查
c++20 concept check for function being declared 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 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>;
};
添加一个额外的对象参数可能更符合抽象概念要求的定义方式(好吧,如果您的 requires-expression 检查多个要求)。在 require-expression 的参数列表中,您可以拥有任意数量的参数。
你可以让参数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 的函数是否存在。
如果函数以正确的类型存在但不是常量,我希望检查失败。我在这里找不到任何相关内容: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 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>;
};
添加一个额外的对象参数可能更符合抽象概念要求的定义方式(好吧,如果您的 requires-expression 检查多个要求)。在 require-expression 的参数列表中,您可以拥有任意数量的参数。
你可以让参数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>;
};
但是如果你这样做的次数足够多,你可以考虑添加一个别名模板来处理这个问题。