Constrained auto for Abbreviated Function Templates
The problem with Abbreviated Function Templates is that it accepts all types of parameters even if the code is not suitable for that particular type. The solution to this is to use the concepts to define the accepted type of parameters.
Syntax
return_type function_name ( C auto paramter_name);
where C is the concept defined somewhere in the program.
Example
Trying to run the above code using concepts that only permit integral values.
C++
// C++ program to illustrate the use of constrained auto in // abbreviated function template #include <iostream> using namespace std; // defining concept template < typename T> concept C = is_integral_v<T>; // function auto getsum(C auto value1, C auto value2) { return value1 + value2; } // driver code int main() { double result = getsum(3.5, 6.2); cout << "The sum is: " << result << endl; return 0; } |
Output
main.cpp: In function ‘int main()’: main.cpp:17:27: error: no matching function for call to ‘getsum(double, double)’ 17 | double result = getsum(3.5, 6.2); | ~~~~~~^~~~~~~~~~ main.cpp:9:6: note: candidate: ‘template requires (C) && (C) auto getsum(auto:11, auto:12)’ 9 | auto getsum(C auto value1, C auto value2) | ^~~~~~ main.cpp:9:6: note: template argument deduction/substitution failed: main.cpp:9:6: note: constraints not satisfied main.cpp: In substitution of ‘template requires (C) && (C) auto getsum(auto:11, auto:12) [with auto:11 = double; auto:12 = double]’: main.cpp:17:27: required from here main.cpp:7:9: required for the satisfaction of ‘C’ [with auto:11 = double] main.cpp:7:13: note: the expression ‘is_integral_v [with T = double]’ evaluated to ‘false’ 7 | concept C = is_integral_v<T>; | ^~~~~~~~~~~~~~~~
The above code shows an error because concept C does not permit double values. It will run fine if the arguments are of type int.
Abbreviated Function Templates in C++ 20
Abbreviated Function Template is a new feature introduced in C++20 to simplify the syntax of function template definition. Traditionally, we use function templates to define a function that can take parameters of different types. But sometimes, it might get complicated and hard to understand. In these cases, we can implement an abbreviated function template to make the function definition clear and concise.
An abreviated function template are the function defintion that contains auto for the parameter type instead of template defined type.