Topic: WG21 paper on templated namespaces


Author: "kwikius" <andy@servocomm.freeserve.co.uk>
Date: Thu, 15 Jun 2006 23:09:27 CST
Raw View
Hi Kaz,

I opted not to answer but rather to post this to comp.std.c++ instead

FWIW The original context on clc++ was. Is there a WG21 proposal
regarding templated namespaces?

regards
Andy Little

Kaz Kylheku wrote:
> kwikius wrote:
> > Victor Bazarov wrote:
> > > kwikius wrote:
> > > > Victor Bazarov wrote:
> > > >> kwikius wrote:
> >
> > > Now, tell me, why can't you add inches to the original struct?
> >
> > Its a library. I can't know all the units a user might want to make use
> > of.
> >
> > > Namespaces have a certain purpose.  Mostly it's to prevent name collisions
> > > and not save typing or grouping for legibility's sake.
> >
> > Sure thats your moral position. OTOH I find it convenient to use a
> > struct for grouping and save typing. Member typedefs are a well known
> > idiom for traits classes for example.
> >
> > A namespace is reopenable which is a useful feature it has over a
> > struct.
>
> So given that it's reopenable, how would you instantiate a namespace
> template? Piece by piece, I suppose: instantiate those parts that are
> visible.
>
> I could see it being a shorthand that could save a lot of repetitive
> template syntax. E.g.
>
> template <typename T> namespace N {
>    int foo(const T &);
> }
>
> Here, uses of the template ID N::foo without template arguments would
> deduce T.
>
> Would this be allowed?
>
> template <typename T> namespace N {
>    void foo(); // no arguments
> }
>
> Here, nothing in the foo type signature depends on T. But foo could
> refer to T things in the namespace.
>
> template <typename T> namespace N {
>    T t;
>    void reset() { T = 0; }
> }
>
> I suppose it's similar to a class with a static member and static
> function:
>
> template <typename T> class C {
> public:
>     static T t;
>     static void reset() { t = 0; }
> };
>
> int C<int>::t;
>
> int main()
> {
>     C<int>::reset();
>     return 0;
> }
>
> Basically, here we are just using the class as a namespace, right? It
> has only static members. We never instantiate the class. Instantiation
> of the template is forced by the definition of the static member.
>
> You have to repeat that definition for every type.
>
> The template namespace could do away with that inconvenience, since the
> namespace could enclose a definition. But then that definition would
> have to be in scope in order to be implicitly instantiated.
>
> Classes are different from namespaces because they separate the
> declaration from the implementation. The entire declaration is visible
> at once. Where it's not visible, the class is not known. A namespace is
> not necessarily all visible at once. Moreover, if a function has a body
> in a class declaration, it's an inline function, which is not true of
> namespaces. A namespace can contain noninline functions.
>
> So there would have to be some special rules for namespace template
> instantiation, such as: 1) instantiate just the necessary parts, from
> whatever part of the templated namespace that is visible, and place the
> instantiations into the translation unit where the reference is made.
> Full function and object definitions are instantiated automatically if
> implicit instantiation takes place. If only declarations are visible,
> they are instantiated, but the definitions are not.
>
> E.g.
>
>
> // File1.cc
>
> template <type T> namespace N {
>    int def_obj = 0;
>
>    extern int decl_obj;
>
>    int def_fun()
>    {
>       return def_obj + decl_obj;
>    }
>
>    int decl_fun();
>
>    int foo;
> }
>
> // ...
>
>   N::def_fun();   // error, ambiguous
>
>   N<int>::def_fun();
>   // requests N<int>::def_fun() instantiation.
>   // also requests N<int>::def_obj instantiation, needed by the body.
>   // also requests N<int>::decl_obj instantiation, but that is just a
> decl
>   // so this won't link unless N<int>::decl_obj is generated somewhere.
>
>   N<int>::decl_fun();
>   // "instantiates" the declaration, but a definition must be
>   // made somewhere.
>
> Now suppose there is a second file:
>
> // File2.cc
>
> template <typename T> namespace N {
>    int decl_obj = 42;
> }
>
> // alternate syntax; must use template arguments on N
>
> template <typename T>
> int N<T>::decl_fun()
> {
>   return decl_obj;
> }
>
> // now we must force instantiation somehow.
>
> // How about explicit request?
> // Generates over all /visible/ N<T>.
> // E.g. does not generate N<int>::foo since
> // N<T>::foo is declared in the other translation unit,
> // which is not known here.
>
> template namespace N<int>;
>
>
>
>
>
>
> >
> > > Try asking in 'comp.std.c++', though.
> >
> > Yes. I was hoping someone might give me an instant answer though!
> >
> > regards
> > Andy Little

---
[ comp.std.c++ is moderated.  To submit articles, try just posting with ]
[ your news-reader.  If that fails, use mailto:std-c++@ncar.ucar.edu    ]
[              --- Please see the FAQ before posting. ---               ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html                      ]