Default Template Arguments: Why Limited to Class Templates?
Despite the convenience offered by default template arguments, they are curiously restricted to class templates, leaving programmers wondering why they cannot be applied to member function templates.
The Argument for Default Template Arguments in Function Templates
Consider the example of a my_class with a member function template:
<code class="cpp">struct my_class { template<class T = int> void mymember(T* vec) { // ... } };</code>
Intuitively, specifying a default type for T in the member function template makes sense. However, C enforces the restriction that default template arguments are only permissible for class templates.
The Reason Behind the Restriction
The limitation stems from historical reasons when freestanding functions were considered inferior to member functions. By forcing all template arguments to be inferred from function arguments, it ensured a consistent treatment.
The Future of Default Template Arguments in Function Templates
C 0x recognized the limitations of the existing restriction. The inclusion of default template arguments for function templates enhances coding flexibility and aligns with the STL programming style.
According to Bjarne Stroustrup, the proponent of this change, the prohibition of default template arguments for function templates is "a misbegotten remnant." He argues that it unnecessarily differentiates freestanding functions from member functions, making it challenging to maintain consistency in code.
Benefits of Default Template Arguments in Function Templates
The introduction of default template arguments into function templates allows for a more streamlined and intuitive coding experience. For example, consider the case of a sort function:
<code class="cpp">template<typename Iterator, typename Comp = std::less< typename std::iterator_traits<Iterator>::value_type> > void sort(Iterator beg, Iterator end, Comp c = Comp()) { ... }</code>
With the default template argument for Comp, the sort function can be called with or without an explicit comparator, simplifying the syntax and increasing code readability.
The above is the detailed content of Why Are Default Template Arguments Restricted to Only Class Templates in C ?. For more information, please follow other related articles on the PHP Chinese website!