相关疑难解决方法(0)

为什么允许嵌套类模板的部分特化,而完全不允许?

    template<int x> struct A {                                                                                                    
        template<int y> struct B {};.                                                                                             
        template<int y, int unused> struct C {};                                                                                  
    };                                                                                                                            

    template<int x> template<> 
    struct A<x>::B<x> {}; // error: enclosing class templates are not explicitly specialized

    template<int x> template<int unused> 
    struct A<x>::C<x, unused> {}; // ok
Run Code Online (Sandbox Code Playgroud)

那么,如果外部类也不是专用的,为什么不允许内部嵌套类(或函数)的显式特化?奇怪的是,如果我只是简单地添加一个虚拟模板参数来部分地专门化内部类,我可以解决这个问题.使事情更丑陋,更复杂,但它确实有效.

我会将完全特化视为部分特化的子集 - 特别是因为您可以通过添加伪参数将每个完整的特化表示为部分.因此,部分和完全专业化之间的消歧对我来说并没有多大意义.

不幸的是,没有人在comp.std.c ++敢于回答,所以我再次以赏金把它放在这里.

注意:我需要此功能用于一组外部类的内部类的递归模板,而内部参数的特化确实取决于外部模板参数.

c++ templates metaprogramming

42
推荐指数
3
解决办法
6677
查看次数

嵌套模板专业化

有一个大脑放屁......是否有可能做出像这样的工作?

template<int a> struct Foo
{
    template<int b> struct Bar;
};

template<int a> struct Foo<a>::Bar<1> //Trying to specialize Bar
{
};
Run Code Online (Sandbox Code Playgroud)

我不具备这样做的,但它可以让我很好地隐藏命名空间范围的一些实施细节.

建议赞赏!

PS:我忘了提到语言不支持明确专门针对Foo范围内的Bar.无论如何,AFAICS.

c++ templates

23
推荐指数
3
解决办法
8957
查看次数

使用默认参数专门化内部模板

当它的参数全部已知时,我无法专门化内部模板.这是一个例子:

template < typename T0 >
struct outer
{
    template < typename T1 = void, typename T2 = void >
    struct inner
    {
        typedef T1 type;
    };
};
template < typename T0 >
template < typename T1 >
struct outer<T0>::inner<double,T1> { typedef int type; };
Run Code Online (Sandbox Code Playgroud)

这很好用.如果我改为像这样指定内部模板,它不会:

template < typename T0 >
template < >
struct outer<T0>::inner<double,void> { typedef int type; };
Run Code Online (Sandbox Code Playgroud)

为此,我得到错误消息,"'''令牌之前的无效显式专门化......封闭类模板没有明确专门化......模板参数未在部分特化中使用:... T0".不确定WTAF会在这里发生.

我也试过这个:

template < typename T0 >
struct outer<T0>::inner<double,void> { typedef int type; };
Run Code Online (Sandbox Code Playgroud)

我预计这会失败,错误信息也就不足为奇了.它是:"模板参数列表太少".

那么,这样做的正确方法是什么?我当然可以解决它,但如果我没有,我宁愿不这样做.

c++ templates specialization

5
推荐指数
1
解决办法
344
查看次数

标签 统计

c++ ×3

templates ×3

metaprogramming ×1

specialization ×1