Yes, you can combine multiple concepts using logical operators like &&
(and) and ||
(or) in a requires
clause. This allows you to specify more complex constraints on template parameters. Here's an example:
#include <concepts>
#include <string>
template <typename T>
requires std::integral<T>
|| std::floating_point<T>
T add(T a, T b) {
return a + b;
}
int main() {
// Valid, int is an integral type
int intResult = add(5, 3);
// Valid, double is a floating-point type
double doubleResult = add(2.5, 1.7);
// Invalid
std::string strResult = add("Hello", "World");
}
error: 'add': no matching overloaded function found
could be 'T add(T,T)'
the associated constraints are not satisfied
the concept 'std::integral<const char*>' evaluated to false
In this example, the add
function template is constrained to accept types that are either integral or floating-point using the ||
operator in the requires
clause. This allows the function to be called with both int
and double
arguments, but not with std::string
.
Answers to questions are automatically generated and may not have been reviewed.
Learn how to use C++20 concepts to constrain template parameters, improve error messages, and enhance code readability.