使用 using 或其他方式显式实例化函数模板

Explicit instantiation of function template with `using` or otherwise

using 对于 class 模板非常有效

 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> 的 specialized/instantiated 别名呢?

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

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