【问题标题】:Using a typedefed default type for template parameter对模板参数使用类型定义的默认类型
【发布时间】:2015-04-16 10:01:29
【问题描述】:

我有一个类,我希望模板参数 B 具有默认类型。问题是默认类型是一个复杂的表达式,还取决于 A 的类型。

下面的代码说明了这种情况但显然不能编译,因为模板表达式内部不知道defaultB类型。

template<class A, class B = defaultB>
class Foo{

   typedef A::Bar Bar;
   typedef Bar::Ex defaultB;


};

有人知道如何正确解决这个问题吗?

【问题讨论】:

  • 不是更简单吗-> template &lt;class A, class B = A::Bar::Ex&gt;?
  • @myaut 谢谢!那么上面的例子就是一个极端简化的情况,问题是 A::Bar::Ex 实际上是一个非常复杂的表达式。

标签: c++ templates typedef


【解决方案1】:

你可以像这样维护一个默认命名空间:

namespace detail {
    template <typename A>
    using defaultB = typename A::Bar::Ex;
}

template<class A, class B = typename detail::defaultB<A>>
class Foo{
};

这使您可以在 detail 命名空间中拥有任意复杂的表达式,而不会使 Foo 声明变得丑陋。

【讨论】:

    【解决方案2】:

    TartanLlama 的出色建议的替代方法是维护一个虚拟类型层次结构以将 typedef 提升到范围:

    template<class A> 
    struct _Foo {
        typedef typename A::Bar Bar;
        typedef typename Bar::Ex defaultB;
    };
    
    template<class A,class B=typename _Foo<A>::defaultB>
    struct Foo : _Foo<A> {
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 2012-07-14
      • 2019-01-09
      相关资源
      最近更新 更多