Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is it not possible to overload class templates?

Reading this question made me wonder: is there a technical reason for disallowing class templates overloads?

By overloading, I mean having several templates with the same names, but different parameters, for instance

template <typename T> struct Foo {};  template <typename T1, typename T2> struct Foo {};  template <unsigned int N> struct Foo {}; 

The compiler manages to handle overloaded functions and function templates, wouldn't it be possible to apply the same techniques (e.g. name mangling) to class templates?

At first, I thought that perhaps that would cause some ambiguity issues when taking the template identifier alone, but the only time this can happen is when passing it as a template template argument, so the type of the parameter could be used to choose the appropriate overload:

template <template <typename> class T> void A {};  template <template <unsigned int> class T> void B {};  A<Foo> a; // resolves to Foo<T> B<Foo> b; // resolves to Foo<N> 

Do you think such feature could be useful? Is there some "good" (i.e. technical) reasons why this is not possible in current C++?

like image 677
Luc Touraille Avatar asked Aug 15 '12 12:08

Luc Touraille


People also ask

Can class templates be overloaded?

A template function can be overloaded either by a non-template function or using an ordinary function template.

How many template parameters are allowed in a template classes?

Explanation: Just like normal parameters we can pass more than one or more template parameters to a template class.

How is the function overloading different from template class?

10. How is function overloading different from template class? Explanation: The function overloading is multiple functions with similar or different functionality but generic class functions perform the same task on given different types of data.

Can templates be used for classes?

Templates in c++ is defined as a blueprint or formula for creating a generic class or a function. To simply put, you can create a single function or single class to work with different data types using templates. C++ template is also known as generic functions or classes which is a very powerful feature in C++.


2 Answers

Section 12.5 from Templates the Complete Guide (Amazon) contains this quote:

You may legitimately wonder why only class templates can be partially specialized. The reasons are mostly historical. It is probably possible to define the same mechanism for function templates (see Chapter 13).

In some ways the effect of overloading function templates is similar, but there are also some subtle differences. These differences are mostly related to the fact that the primary template needs to be looked up when a use is encountered. The specializations are considered only afterward, to determine which implementation should be used.

In contrast, all overloaded function templates must be brought into an overload set by looking them up, and they may come from different namespaces or classes. This increases the likelihood of unintentionally overloading a template name somewhat.

Conversely, it is also imaginable to allow a form of overloading of class templates. Here is an example:

// invalid overloading of class templates template<typename T1, typename T2> class Pair;  template<int N1, int N2> class Pair;  

However, there doesn't seem to be a pressing need for such a mechanism.

Furthermore, the Design and Evolution of C++ (Amazon) contains this quote in section 15.10.3

I therefore concluded that we needed a mechanism for "specializing" templates. This could be done either by accepting general overloading or by some more specific mechanism. I chose a specific mechanism because I thought I was primarily addressing irregularities caused by irregularities in C and because suggestions of overloading invariably creates a howl of protests. I was trying to be cautious and conservative; I now consider that a mistake. Specialization as originally defined was a restricted and anomalous form of overloading that fitted poorly with the rest of the language.

Bold emphasis mine. I interpret this as saying that function overload resolution is more difficult to implement (and get right by users) than class specialization. So probably no real technical obstacles (similary for function template partial specialization) but an historical accident.

like image 142
TemplateRex Avatar answered Oct 12 '22 01:10

TemplateRex


You cannot "overload" type parameter, non-type argument and template template parameter, but you can specialize variadic template:

template <typename... T> struct Foo;  template <typename T1> struct Foo<T1> {};  template <typename T1, typename T2> struct Foo<T1,T2> {}; 
like image 35
log0 Avatar answered Oct 12 '22 01:10

log0