派生的类型名称

时间:2017-11-13 19:43:27

标签: c++ c++11 templates

我有很多不同的函数,它们执行非常类似的操作,其中类型和大小通过函数名称编码,如下所示:

int * operation_0_0_i( int a ) {
   int * result = new int[4];
   /* ... */
   return result;
}
int * operation_0_1_i( int a ) {
   int * result = new int[8];
   /* ... */
   return result;
}

float * operation_0_0_f( float a ) {
   float * result = new float[4];
   /* ... */
   return result;
}

float * operation_0_1_f( float a )  {
   float * result = new float[4];
   /* ... */
   return result;
}

我没有考虑使用模板这些容易混淆的不同功能。我第一次尝试模板结构,实现派生类型:

template< typename T >
struct A {
  using type = T;
  using array = std::array< T, 4 >;
};

template< typename T >
struct B {
   using type = T;
   using array = std::array< T, 8 >;
};

所以我可以做那样的事情:

template< class U, typename T >
T* operation0( T a ) {
  typename U<T>::array a; 
  /* ... */
  return a.data();   // I know, that this is unsafe. Its just for this example                                                                                    
}

template< class U, typename T >
T* operation1( T a ) {
  typename U<T>::array a;                                                                                     
  /* ... */
  return a.data();
}

int main() {
   int * res1 = operation1<A, int>( 3 );
   int * res2 = operation2<B, int>( 8 );
   /* ... */
   return 0;
}

不幸的是,这不会编译。 g ++告诉我

In function ‘T* operation0(T)’: error: expected nested-name-specifier before ‘U’ typename U<T>::array a;

显然,typename说明符在这个位置是错误的。但是如果我删除那个说明符,g ++会抱怨

‘U’ is not a template U<T>::array a;

有谁知道,我做错了什么?是否有更好的方法,可能是使用std::variant?谢谢你的时间;)

此致

1 个答案:

答案 0 :(得分:3)

你需要告诉你的U类是模板并带1个参数:

template<template <class > class U, typename T >
T* operation0( T _a ) {
  typename U<T>::array a;
  /* ... */
  return a.data();                                                              
}