C ++ 11别名和模板模板

时间:2016-07-14 10:46:44

标签: c++ templates c++11 alias

我有以下课程

struct Abis
{
  void foo() { // does something }
};

struct A
{
  typedef Abis bis_type; 
  bis_type create() { // instanciates Abis object };

};

template<class Tbis> // typically Tbis would be Abis
struct Bbis
{
  // something
};

template<class T> // typically T would be A
struct B
{
  typedef Bbis<typename T::bis_type> bis_type; 
  bis_type create() { // instanciates Bbis object };
};

现在我想添加另一个图层:

template<class Tbis, template<class> class Ubis> 
struct Cbis : public Ubis<Tbis>
{
   void additional_method() { // does something calling Tbis and Ubis methods}
};

并且有一个C类实例化一个Cbis对象,所以我可以编写类似的东西:

C<A,B> c();
Cbis<Abis,Bbis> cbis = c.create();
cbis.additional_method();

这需要能够引用typedef bis_types,所以我尝试了这个

template<class T, template<class> class U> 
struct C
{
   template<class S>
   using Ubis_type = U<S>::bis_type // PROBLEM!
   typedef Cbis<typename T::bis_type,Ubis_type> bis_type; 

   bis_type create(); 
}

这似乎不起作用,也不起作用

template<class T, template<class> class U> 
struct C
{
   template<class S>
   using Ubis_type = typename U<S>::bis_type // PROBLEM!
   typedef Cbis<typename T::bis_type,Ubis_type> bis_type; 

   bis_type create(); 
}

作为临时修复,我可以将B类型作为模板参数传递给Cbis,但这并不真正尊重设计,我想了解问题所在。

我的语法是否正确? (我正在使用XCode 7.3)

由于

1 个答案:

答案 0 :(得分:0)

主要问题在于您的typedef Bbis bis_type行 - Bbis是一个类模板而不是一个类。我认为你的意思很可能是typedef Bbis<T> bis_type(假设你在这种情况下有T类型)。在那之后,你的代码基本上可以工作(我必须纠正一些拼写错误才能让它编译),这是最终版本:

更新:更改了struct C的定义以适应C<A, B>所需的用例)

struct Abis
{
  void foo() { // does something 
  }
};

struct A
{
  typedef Abis bis_type; 
  bis_type create() { // instanciates Abis object 
    return Abis();
  }

};

template<class Tbis> // typically Tbis would be Abis
struct Bbis
{
  // something
};

template<class T> // typically T would be A
struct B
{
  typedef Bbis<T> bis_type; 
  bis_type create() { // instanciates Bbis object 
  };
};

template<class Tbis, template<class> class Ubis> 
struct Cbis : public Ubis<Tbis>
{
   void additional_method() { // does something calling Tbis and Ubis methods
   }
};

template<class T, template<class> class U> 
struct C
{
   template<class S>
   using Ubis_type = typename U<S>::bis_type; // PROBLEM!

   typedef Cbis<typename U<T>::bis_type,Ubis_type> bis_type; 

   bis_type create()
   {
        return bis_type();    
   } 
};

然后你可以像这样使用你的最终struct C

int main(int argc, char**args) 
{
    C<A, B> c;
    auto d = c.create();

    d.additional_method();

    return 0;
}