Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;20_C++_Templates_C++20_C++ Concepts - Fatal编程技术网

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
函数,并让重载解析按预期工作。