首页 > 解决方案 > 概念中的 C++ 值评估

问题描述

如何正确评估概念声明/要求子句中的值?

考虑一个is_red检查给定类型是否具有color设置为的静态 cx 成员的概念/*undefined*/::red,其中 `/ undefined / 在枚举中;

template <typename T>
concept is_red = requires(T) {
   { T::color == decltype(T::color)::red };
};

这显然是错误的,因为它只检查合成器是否定义明确。
因此,这将无法按预期工作:

namespace apple {
   enum colors{red, green, yellow };

   struct granny_smith{
      constexpr static auto color = colors::green;
   };
}

static_assert(is_red<apple::granny_smith>); // should fail, but it does not using the previous concept implementation

在此处查看 Godbolt上的实时示例。

这是我目前评估概念值的方式:

template <bool condition>
using if_t = std::conditional_t<condition, std::true_type, std::false_type>;

template <typename T>
concept is_red = requires(T) {
   { if_t<(T::color == decltype(T::color)::red)> } -> std::same_as<std::true_type>;
};

效果很好,但看起来有点奇怪。

也许还有另一种更简洁的方法来处理 C++ 概念中的值评估?

标签: c++c++20c++-concepts

解决方案


概念可以在右侧采用任意布尔表达式。requires-expression就是这样一种布尔表达式,但不一定非要如此。可以直接写一个对比:

template <typename T>
concept is_red = T::color == decltype(T::color)::red;

推荐阅读