我有很多不同的函数,它们执行非常类似的操作,其中类型和大小通过函数名称编码,如下所示:
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
?谢谢你的时间;)
此致
答案 0 :(得分:3)
你需要告诉你的U类是模板并带1个参数:
template<template <class > class U, typename T >
T* operation0( T _a ) {
typename U<T>::array a;
/* ... */
return a.data();
}