使用 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
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