C++:有没有办法创建模板化的命名空间?

Tal*_*ion 3 c++ templates namespaces c++11

我想知道是否有可能做到以下几点:

template <typename T>
namespace basic_foo {
    struct str {
        T value;
    };
}

basic_foo<char>::str s1;
namespace foo = basic_foo<char>;
foo::str s2;
Run Code Online (Sandbox Code Playgroud)

是否可以在任何c ++编译器中执行此操作?
是否有工作要做到这一点?
我认为这对语言来说是一个很好的补充.

提前致谢.

Jam*_*lis 10

不,您无法定义命名空间模板.但是,通过创建basic_foo类模板,您可以实现几乎完全符合您的要求(语法略有不同):

template <typename T>
struct basic_foo {
    struct str {
        T value;
    };
};

basic_foo<char>::str s1;
typedef basic_foo<char> foo;
foo::str s2;
Run Code Online (Sandbox Code Playgroud)

  • @BenVoigt:是的,会找到`basic_foo <T>`的朋友.请参阅https://gist.github.com/3061359.g ++ 4.7和Visual C++ 2012 RC都接受它(这通常是个好兆头). (2认同)
  • @JamesMcNellis:朋友的方法很接近但不完全一样.自由函数friend声明提供了名称空间级别函数的声明,但仅在封闭类中.角落案例现在转移到这样一个事实:在类定义内部定义的朋友(并没有在命名空间级别显式声明)只能*由ADL找到,这反过来意味着你无法获得指向它的指针,而这反过来又是意味着你无法将其传递给算法...... (2认同)

Gri*_*wes 5

不,但你可以使用模板化结构:

template<typename T>
struct basic_foo
{
    struct str
    {
        T value;
    };
};

typedef basic_foo<char> foo;
foo::str s1;
Run Code Online (Sandbox Code Playgroud)

您也可以使用class而不是struct,但public:在这种情况下您必须记住.