弱链接的模板特化

时间:2018-01-23 09:55:21

标签: c++ templates specialization weak-linking

是否可以定义弱链接的模板特化?

在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&lt; float&gt;专业化:

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 个答案:

没有答案