Можно ли определить слабо связанные шаблонные специализации?
В 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, специфичную для аппаратного обеспечения. Я хочу, чтобы это определение переопределило использование по умолчанию :: sqrt<поплавок> специализация:
hw.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.
Задача ещё не решена.
Других решений пока нет …