Re: Template parameter visibility in specialization
Am 11.02.2012 10:43, schrieb Vidar Hasfjord:
It would be useful to have the primary template parameters visible in
a specialization. Now you need to restate the provided arguments if
you need them within the specialization, and this is a maintenance
hazard. For example:
template<int MessageId>
struct TDispatch;
template<> struct TDispatch<42>
{
enum {Id = MessageId}; // Error: MessageId is undefined.
//enum {Id = 42}; // Works, of course, but error-prone.
};
int main()
{return TDispatch<42>::Id;}
Is there a good reason why the parameters are not visible?
I would find it *very* astonishing and problematic, if renaming
the parameter name of a primary template would have impact on a
specialization where this parameter would be somehow implied. The
specialization TDispatch<42> is a class type, no class template anymore,
so why bother about names in a completely unrelated type family?
Further, this mapping would very much depend on the kind of declaration
that the specialization sees, e.g. consider
// Header 1:
template<int MessageId>
struct TDispatch;
// Header 2:
template<int MI>
struct TDispatch;
// Header 3:
template<int>
struct TDispatch;
All three declarations of the TDispatch template are equivalent. Noe
consider
// Header for specialization
#include <HeaderI> // I=1, 2, or 3
const int MessageId = 42;
template<> struct TDispatch<42>
{
enum {Id = MessageId};
};
The meaning of this program would now strongly depend on the form of the
declaration of the primary template - this looks extremely dangerous to me.
As the last example demonstares, there are much easier way to ensure
consistency, e.g.
const int MyMessageId = 42;
template<> struct TDispatch<MyMessageId>
{
enum {Id = MyMessageId};
};
HTH & Greetings from Bremen,
Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]