让C++推导出一个参数定义的类/命名空间的位置

Joh*_*nes 4 c++ c++11

此代码编译时没有任何警告或错误,并且是可执行的.

template<class T>
struct testclass
{
    template<int I>
    class inner {};
    template<int I>
    void f(inner<I> ) {}
};

int main()
{
    testclass<bool> test;
    test.f(testclass<bool>::inner<3>()); // l. 13
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,我想做的是省略第testclass::13行:

test.f(inner<3>());
Run Code Online (Sandbox Code Playgroud)

这是行不通的.我可以在testclass'定义中添加任何内容,以便我的代码有效吗?

允许使用C++ 11.

Cyg*_*sX1 7

通常,没有允许这种推断的全局编译器标志,因为这会破坏名称范围.

但是,您可以在外部使用typedef(或者在模板的情况下 - 具有类型别名).在你的情况下,它将是:

template <int I> using inner = testclass::inner<I>;
Run Code Online (Sandbox Code Playgroud)

这必须写在全局命名空间中,而不是在testclass.

请注意,模板别名 C++ 11的一项功能

  • 如果testclass本身就是一个模板,为什么你不在问题中这样说呢? (3认同)