简体   繁体   English

C++ 20 概念:要求运算符重载

[英]C++ 20 Concepts: Require operator overloading

I am trying to understand how to declare a concept that requires a particular operator is overloaded for a given type.我试图了解如何声明一个需要特定运算符重载的给定类型的概念。 Lets say I have the following function that takes a vector of an arbitrary type and prints it to std::cout :假设我有以下 function ,它采用任意类型的向量并将其打印到std::cout

template<typename printable>
void print_vector(const std::vector<printable>& vec) 
{
  std::cout << '{';
  for (const printable &item : vec) {
    std::cout << item << ',';
  }
  std::cout << '}';
}

This code will work just fine if the type printable has an overloaded << operator, but if it doesn't, then it fails with a very unhelpful compiler error.如果printable类型具有重载的<<运算符,则此代码将正常工作,但如果没有,则它将失败并出现非常无用的编译器错误。 I feel like I should be able to somehow declare a concept that requires a type has a valid << operator defined, and use that concept in the function declaration, so that I can get a more useful compiler error, but I haven't been able to figure out how to do it.我觉得我应该能够以某种方式声明一个需要类型定义了有效<<运算符的概念,并在 function 声明中使用该概念,这样我可以获得更有用的编译器错误,但我没有能够弄清楚如何去做。

template <class T>
concept Printable = requires(std::ostream& os, T a)
{
    os << a;
};


template<Printable T>
void print_vector(const std::vector<T>& vec) {
  std::cout << '{';
  for (const auto &item : vec) {
    std::cout << item << ',';
  }
  std::cout << '}';
}

If you wish you could also make it more generic to operate on basic_ostream .如果您愿意,还可以使其在basic_ostream上的操作更加通用。


Here is the clang error message:这是 clang 错误消息:

 <source>:30:5: error: no matching function for call to 'print_vector' print_vector(x); ^~~~~~~~~~~~ <source>:19:6: note: candidate template ignored: constraints not satisfied [with T = X] void print_vector(std::vector<T> vec) { ^ <source>:18:10: note: because 'X' does not satisfy 'Printable' template<Printable T> ^ <source>:10:9: note: because 'os << a' would be invalid: invalid operands to binary expression ('std::ostream' (aka 'basic_ostream<char>') and 'X') os << a; ^

and gcc:和 gcc:

 <source>: In function 'auto test()': <source>:30:19: error: use of function 'void print_vector(std::vector<T>) [with T = X]' with unsatisfied constraints 30 | print_vector(x); | ^ <source>:19:6: note: declared here 19 | void print_vector(std::vector<T> vec) { | ^~~~~~~~~~~~ <source>:19:6: note: constraints not satisfied <source>: In instantiation of 'void print_vector(std::vector<T>) [with T = X]': <source>:30:19: required from here <source>:8:9: required for the satisfaction of 'Printable<T>' [with T = X] <source>:8:21: in requirements with 'std::ostream& os', 'T a' [with T = X] <source>:10:9: note: the required expression '(os << a)' is invalid 10 | os << a; | ~~~^~~~ cc1plus: note: set '-fconcepts-diagnostics-depth=' to at least 2 for more detail

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM