C++20 中采用模板参数的成员函数的概念
Concept for member function taking a template parameter in C++20
我想对
有一个概念
struct creatorclass {
template<typename T>
int fct(T val)
{
return 42;
}
};
我想要的是在不指定模板参数的情况下检查函数 fct 是否存在的概念。那就是想要
template<typename U>
concept CREATOR=requires(U val) {
val.fct;
};
我认为这是不可能的,因为一个概念需要被评估和编译。不知道 class T 就无法做到这一点。我说得对吗?
注意:Specifying a concept for a type that has a member function template using Concepts Lite 也说这是不可能的,但这是六年前 C++20 标准之前的精简概念。
据我所知,如果不评估任何模板参数,就无法测试模板成员函数。
也就是说,如果您知道允许的输入分类是什么——比如一个函数是否只能用整数值或其他东西来计算像这样——然后你可以用一个显式实例化来测试它,无论你的目的是什么,它都可以是 'good enough':
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
作为模板的状态也变得不如它具有可由 U
调用的成员函数调用 fct
的状态重要 - - 并且可以简化为:
template <typename T, typename U>
concept fnc_evaluatable = requires(T val, U in) {
val.fct(in);
};
我想对
有一个概念struct creatorclass {
template<typename T>
int fct(T val)
{
return 42;
}
};
我想要的是在不指定模板参数的情况下检查函数 fct 是否存在的概念。那就是想要
template<typename U>
concept CREATOR=requires(U val) {
val.fct;
};
我认为这是不可能的,因为一个概念需要被评估和编译。不知道 class T 就无法做到这一点。我说得对吗?
注意:Specifying a concept for a type that has a member function template using Concepts Lite 也说这是不可能的,但这是六年前 C++20 标准之前的精简概念。
据我所知,如果不评估任何模板参数,就无法测试模板成员函数。
也就是说,如果您知道允许的输入分类是什么——比如一个函数是否只能用整数值或其他东西来计算像这样——然后你可以用一个显式实例化来测试它,无论你的目的是什么,它都可以是 'good enough':
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
作为模板的状态也变得不如它具有可由 U
调用的成员函数调用 fct
的状态重要 - - 并且可以简化为:
template <typename T, typename U>
concept fnc_evaluatable = requires(T val, U in) {
val.fct(in);
};