是否有办法欺骗编译器允许头文件中的模板特化?

Is there any way to trick the compiler into allowing template specializations in the header file?

本文关键字:文件 许头 欺骗 编译器 是否      更新时间:2023-10-16

通常,当您编写模板类并在该类中具有函数的专门化时,您需要将专门化放在.cpp文件中,因为它是一个具体的定义(而不是模板定义)。如果你只有一个很小的函数要专门化,虽然这有点烦人,但有时你可能会忘记在.cpp文件中查找最后一个定义,这可能会导致混乱。

在这种情况下,最好在头文件中包含一个专门化和模板定义的其余部分。有什么技巧可以让你做到这一点吗?

使用inline关键词:

template <unsigned N>
unsigned get_const()
{
    return N;
}
template <>
inline unsigned get_const<42>()
{
    throw "meaning of life";
}

关键字表明多个定义应该被假定为相同的,因此不存在错误。(这与static是正交的,后者在自己的翻译单元中保留重复的定义。)

注意,这适用于所有函数,而不仅仅是模板或特殊化。

您可以将专门化包围到空的namespace中,但这可能导致它们在不同的名称空间中定义。然后,您可以在空名称空间中创建别名,这些别名是这些专门化的typedef