代码之家  ›  专栏  ›  技术社区  ›  Danvil

在没有typedef的情况下,能否访问模板外部的模板参数?

  •  8
  • Danvil  · 技术社区  · 14 年前

    一个简单的例子:

    template<typename _X> // this template parameter should be usable outside!
    struct Small {
       typedef _X X; // this is tedious!
       X foo;
    };
    
    template<typename SomeSmall>
    struct Big {
       typedef typename SomeSmall::X X; // want to use X here!
       SomeSmall bar;
       X toe;
    };
    

    有没有办法访问模板参数 X 属于 Small 不在中使用typedef 上课?

    2 回复  |  直到 14 年前
        1
  •  5
  •   In silico    14 年前

    取决于你在做什么, template template parameters 可能是更好的选择:

    // "typename X" is a template type parameter. It accepts a type.
    // "template <typename> class SomeSmall" is a template template parameter.
    // It accepts a template that accepts a single type parameter.
    template<typename X, template <typename> class SomeSmall> 
    struct Big {
       SomeSmall<X> bar; // We pass X to the SomeSmall template.
       X toe; // X is available to this template.
    }; 
    
    // Usage example:
    
    template<typename X>
    struct Small { 
       X foo; 
    };
    
    struct MyType {};
    
    // The foo member in Small will be of type MyType.
    Big<MyType, Small> big;
    
        2
  •  9
  •   Potatoswatter R. Martinho Fernandes    14 年前

    是的,用部分专门化定义第二个“getter”模板。

    template< typename >
    struct get_Small_X; // base template is incomplete, invalid
    
    template< typename X > // only specializations exist
    struct get_Small_X< Small< X > > {
        typedef X type;
    };
    

    Small<X>::X 你有 typename get_Small_X< Small<X> >::type .

    _X 是一个保留的标识符,因此不应将其用于任何用途。 X_ 是更好的选择。


    在我考虑的时候,您不需要为每个模板分别定义它。一个主模板就可以做到这一点。

    这是在Comeau编译的,我知道有关于匹配模板参数的规则,但是我认为模板参数是被禁止的 部分专门化中的模板。

    template< typename >
    struct get_first_type_argument;
    
    template< template< typename > class T, typename X >
    struct get_first_type_argument< T< X > > {
        typedef X type;
    };
    
    template< typename X >
    struct simple;
    
    get_first_type_argument< simple< int > >::type q = 5;
    

    这只与“一元”模板一起工作,但对于一般情况,可以在C++ 0x中进行修改。