是否可以定义弱链接模板特化?
在 math_functions.h 我有:
namespace utils {
template <typename T_TYPE>
T_TYPE sqrt(T_TYPE value);
template <>
float sqrt(float value) __attribute__((weak));
template <>
double sqrt(double value) __attribute__((weak));
template <>
long double sqrt(long double value) __attribute__((weak));
} // End namespace utils.
在 math_functions.cpp 中,我有模板专业化的默认实现,我希望这些实现可以被覆盖:
namespace utils {
template <>
float sqrt(float value) {
return sqrtf(value);
}
template <>
double sqrt(double value) {
return sqrt(value);
}
template <>
long double sqrt(long double value) {
return sqrtl(value);
}
} // End namespace utils.
然后我有一个微控制器的目标特定文件,它应该提供更有效的 sqrt 功能,特定于硬件。我希望这个定义覆盖默认的 utils::sqrt<float> 专业化:
硬件.cpp:
namespace utils {
template <>
float sqrt<float>(float value) {
float out;
// Use hardware assembler call to run SQRT on VFPU.
__asm("VSQRT.F32 %0,%1" : "=t"(out) : "t"(value));
return out;
}
} // End namespace utils.
我想做的甚至可能吗?
对于上面的代码,GCC 抱怨 utils::sqrt 的多个定义。