代码之家  ›  专栏  ›  技术社区  ›  Newline

可转换为满足概念的类型的表达式的结果

  •  0
  • Newline  · 技术社区  · 4 月前

    在需求表达式中(如果我的术语不正确,请原谅),每个需求都有一个表达式和可选的类型约束。后者必须是一个概念。例如:

    template<typename T>
    concept HasBar = requires( T t ) { { t.bar } -> std::convertible_to<float>; };
    

    类似于 std::convertible_to ,人们可以构建一个名为 decays_to 或者别的什么。

    那么,要求表达式产生可转换为/衰减为概念的东西(好吧,满足概念的某种类型)的最简单明了的方法是什么呢 std::floating_point , std::integral , MyConcept 等等?人们应该对这些概念进行半复制吗?比如: ConvertibleToFloatingPoint , DecaysToFloatingPoint , DecaysToMyConcept 等等?

    1 回复  |  直到 4 月前
        1
  •  1
  •   HolyBlackCat    4 月前

    “转换为某种T匹配概念C”从根本上是不可能的,编译器不会检查所有可能的转换目标。

    “衰减到类型匹配概念C”是可能的,但不是用最漂亮的语法。

    不可能 DecaysTo<std::convertible_to<float>> 因为概念不能作为模板参数传递。但是可以传递特征:

    template <typename T, template <typename...> typename Trait, typename ...P>
    concept DecaysTo = Trait<std::decay_t<T>, P...>::value;
    

    然后: { t.bar } -> DecaysTo<std::is_convertible, float>;

    或者,一种不那么复杂的方法是:

    template<typename T>
    concept HasBar = requires(T t)
    {
        requires std::convertible_to<std::decay_t<decltype(t.bar)>, float>;
    };
    

    或者,你可以通过强制表达式衰减来作弊,例如:

    template<typename T>
    concept HasBar = requires(T t)
    {
        { auto(t.bar) } -> std::convertible_to<float>;
    };
    

    但这需要 bar 可复制性,所以国际海事组织认为情况更糟。