如何解决在 C++20 中采用模板参数的成员函数的概念
我想要一个概念
struct creatorclass {
template<typename T>
int fct(T val)
{
return 42;
}
};
我想要的是一个检查函数 fct 是否存在而不指定模板参数的概念。那就是想要
template<typename U>
concept CREATOR=requires(U val) {
val.fct;
};
我认为这是不可能的,因为需要对概念进行评估和编译。如果不知道 T 类,就无法做到这一点。我说的对吗?
注意:Specifying a concept for a type that has a member function template using Concepts Lite 也表示这是不可能的,但这是在 6 年前 C++20 标准之前的概念精简版。
解决方法
据我所知,不评估任何模板参数就无法测试模板成员函数。
也就是说,如果您知道允许输入的分类是什么——例如如果一个函数只能用整数值或类似的东西来评估——那么您可以使用显式实例化对其进行测试,无论您的目的是什么,这都可能“足够好”:
template<typename U>
concept CREATOR=requires(U val) {
// Checks that 'val' has a 'fct' function template that works with integers
val.template fct<int>(5);
};
然而,在大多数情况下,围绕履行其合同所需的完整原子定义来定义概念通常更有用 - 在这一点上,通常最好将此评估转移到 template
参数还有:
template <typename T,typename U>
concept fnc_evaluatable = requires(T val,U in) {
val.template fct<U>(in);
};
然后在更大的作品中使用它。
在这一点上,fnc
作为模板的状态也变得不那么重要,因为它具有可被 fct
调用的成员函数调用 U
-- 并且可能可以简化为:
template <typename T,U in) {
val.fct(in);
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。