Слабо связанные шаблонные специализации

Можно ли определить слабо связанные шаблонные специализации?

В 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:

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.

0 ответов

Другие вопросы по тегам