C++ C++;20
我们如何将这个问题中的需求转化为一个概念 我尝试了以下几点:C++ C++;20,c++,templates,c++20,c++-concepts,C++,Templates,C++20,C++ Concepts,我们如何将这个问题中的需求转化为一个概念 我尝试了以下几点: template< typename U, typename Tin, typename Tout> concept MyConditions = ( U::value_type && Tin::value_type && Tout::value_type && std::is_floating_p
template< typename U, typename Tin, typename Tout>
concept MyConditions =
(
U::value_type
&& Tin::value_type
&& Tout::value_type
&& std::is_floating_point_v<typename Tin::value_type>
&& std::is_integral_v<typename U::value_type>
&& std::is_floating_point_v<typename Tout::value_type>
);
模板
概念条件=
(
U::值\类型
&&Tin::值\类型
&&Tout::value\u类型
&&std::是浮点数吗
&&标准::是积分吗
&&std::是浮点数吗
);
此概念现在应用于我的一个成员函数:
class test_concept
{
template< typename U, typename Tin, typename Tout>
requires MyConditions <U, Tin, Tout>
static void test_routine(const U&, const Tin&, Tout& );
}
类测试\u概念
{
模板
需要真菌条件
静态孔隙测试程序(const-U和,const-Tin和,Tout和);
}
测试时:
std::vector<double> test{ };
std::vector<int> testi{ };
std::vector<double> test2{ };
test_concept::test_routine(testi, test, test2);
std::向量测试{};
std::载体睾丸{};
std::vector test2{};
测试概念:测试例程(testi、test、test2);
使用clang
我得到一条错误消息,没有找到匹配项,并显示一条注释:
注意:由于替换的约束表达式格式错误:缺少
之前的“typename”
依赖类型名称“vector::value\u type”
U::值\类型
您不需要手动检查是否存在这些类型。如果它们不存在,SFINAE将导致您的概念以静默方式返回
false
。因此:
template< typename U, typename Tin, typename Tout>
concept MyConditions =
std::is_integral_v<typename T::value_type> &&
std::is_floating_point_v<typename U::value_type> &&
std::is_floating_point_v<typename Tout::value_type>;
此外,与旧的特征相比,您更喜欢标准概念:
template< typename U, typename Tin, typename Tout>
concept MyConditions =
requires
{
typename U::value_type;
typename Tin::value_type;
typename Tout::value_type;
requires std::integral<typename T::value_type>;
requires std::floating_point<typename U::value_type>;
requires std::floating_point<typename Tout::value_type>;
};
模板
概念条件=
要求
{
typename U::value\U type;
typename Tin::value\u type;
typename Tout::value\u type;
需要std::积分;
需要std::浮点;
需要std::浮点;
};
您不需要手动检查是否存在这些类型。如果它们不存在,SFINAE将导致您的概念以静默方式返回false
。因此:
template< typename U, typename Tin, typename Tout>
concept MyConditions =
std::is_integral_v<typename T::value_type> &&
std::is_floating_point_v<typename U::value_type> &&
std::is_floating_point_v<typename Tout::value_type>;
此外,与旧的特征相比,您更喜欢标准概念:
template< typename U, typename Tin, typename Tout>
concept MyConditions =
requires
{
typename U::value_type;
typename Tin::value_type;
typename Tout::value_type;
requires std::integral<typename T::value_type>;
requires std::floating_point<typename U::value_type>;
requires std::floating_point<typename Tout::value_type>;
};
模板
概念条件=
要求
{
typename U::value\U type;
typename Tin::value\u type;
typename Tout::value\u type;
需要std::积分;
需要std::浮点;
需要std::浮点;
};
感谢您提供的不同选项!。你所说的偏好标准概念是什么意思?我们应该更喜欢std::integral
而不是std::integral\u v
?如果是,那为什么?@A2LBK是的,这就是我的意思。我不认为这有什么不同,但在某些情况下确实如此。请看,虽然您可以将所有条件移动到所需的,但盲目地这样做并不是一个好主意,因为它会将您的概念从公认的原子约束连接变成一个大的blob。从问题的概念来看,这意味着MyConditions
不再比任何std::integral/floating_point
片段更具体,因此,您不能再使用std::integral
函数重载MyConditions
函数,并让重载解决方案如您所期望的那样工作。感谢您提供的不同选项!。你所说的偏好标准概念是什么意思?我们应该更喜欢std::integral
而不是std::integral\u v
?如果是,那为什么?@A2LBK是的,这就是我的意思。我不认为这有什么不同,但在某些情况下确实如此。请看,虽然您可以将所有条件移动到所需的,但盲目地这样做并不是一个好主意,因为它会将您的概念从公认的原子约束连接变成一个大的blob。从问题的概念来看,这意味着MyConditions
不再比其std::integral/floating_\u point
部分更具体,因此您不能再使用std::integral
函数重载MyConditions
函数,并让重载解析按预期工作。