1

using类模板就像一个魅力

 template<class T,int N>
 struct VecNT{ T arr[N]; };

 using Vec5d = VecNT<double,5>;     // doing great job!

但似乎它根本不适用于功能

 template<class T,int N>
 T sumNT(T* xs){ T sum=0; for(int i=0;i<N;i++){sum+=xs[i];}; return sum; };

 using sum5d = sumNT<double,5>;  
    // ERROR: sumNT<double,5> does not name a type

 using sum5d(double* xs) = sumNT<double,5>(T* xs);
    // ERROR: expected nest-name-specifier before 'sum5d'

那么如何sum5d作为一个专门的/实例化的别名sumNT<double,5>呢?

4

1 回答 1

2

您可以为您的别名声明一个函数指针:

template<class T,int N>
T sumNT(T* xs){ T sum=0; for(int i=0;i<N;i++){sum+=xs[i];}; return sum; };

constexpr auto sum5d = &sumNT<double,5>;  

int main()
{
    double d[5];
    sum5d(d);
}

GCC 和 Clang 设法优化掉函数指针并直接调用原始函数,MSVC 没有:https ://godbolt.org/z/1_fs83

于 2019-08-29T07:20:16.220 回答