C++ 概念 : How to use 'concept' to check the property of a templated struct?

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

我目前正在试验新的 c++2a“概念”功能。我下面的代码的目标是检查模板化结构的某些属性。作为第一个模板参数 is 'reserved' for the type to be checked ,如果没有 requires 表达式或手动指定模板参数,我很难使用这个概念。这没什么大不了的,但我喜欢 concept 符号,因为它很清晰。有办法解决这个问题吗?

编译器

gcc-g++-10.0 (GCC) 10.0.1 20200119 (experimental)
Copyright (C) 2020 Free Software Foundation, Inc.

编译命令

g++-10.0 -std=c++2a file.cc

代码


#include <concepts>

/// Struct has template arguments and a property that can be checked in a concept.
template <bool a> struct A {
  constexpr static bool property() noexcept { return a; }
};

template <typename T, bool a> concept hasProp = std::is_same_v<T, A<a>> && A<a>::property();

template <bool a> requires hasProp<A<a>, a> void works(A<a> c) {} 
template <bool a, hasProp<a> c> void deductionError(c d) {};

// This is a sketch of what I'd like to do:
// template <A<a, b> Class, bool a, bool b> concept hasProp = Class::property;

int main() {
  A<true> a;
  A<false> b;

  works(a);
  //works(b); //doesn't compile as the constraint is not fulfilled, which is desired.

  //deductionError(a); // I get why this deduction error occurs, but is it possible to do this
                      // in a clean way using concepts without having so specify template arguments?
}

最佳答案

救援的部分类模板特化:

template<class T> 
struct HasProp : std::false_type{};

template<bool a>
struct HasProp<A<a>> : std::integral_constant<bool, A<a>::property()>
{};

template <class T> 
concept hasProp = HasProp<T>::value;

template <bool a> 
requires hasProp<A<a>>
void works(A<a>) {}

template<hasProp C> 
void deductionError(C){} // no longer a deductionError

Demo


这确实(可能不必要地)将您的概念直接与 A 联系起来。

您可以改为这样做(如 @Barry answered ):

template <class T> 
concept hasProp = T::property();

Demo2

关于C++ 概念 : How to use 'concept' to check the property of a templated struct?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60376806/

相关文章:

c++ - C++ 和 Fortran 中的不同精度

c++ - 是否保证模板模板参数调用用户提供的推导指南

c++ - 在 C++ 中使用模板回调函数

c++ - 为什么 C++ 范围 "transform -> filter"为匹配过滤器谓词的值调用转换两次?

c++ - std::assignable_from 可能实现背后的基本原理

c++ - '.Position' 的左边必须有类/结构/union

使用概念具有特定值类型的任何容器的 C++ 迭代器

c++ - 如何编写利用 ADL 的概念

c++ - 使用概念的部分特化

c++ - 约束成员函数和显式模板实例化