与枚举匹配的模板函数中的 C++ 无法解释的变化

标签 c++ templates enums template-specialization function-templates

我有以下包含模板函数的代码。当我使用第二个参数作为枚举调用此函数时:在某些情况下,它会找到模板特化,而在某些情况下,它不会。

我已验证枚举在两种情况下都是相同的枚举(例如,没有重新定义)并且其他参数具有正确的值,我发现一个编译是使用 -Winline set 完成的(我还没有尝试更改它)还有什么要看的?

class A {
public:
    template <typename T>
    int f(uint32_t id, T const& t, bool cond);

    ...
};

template <typename T>
int A::f(uint32_t id, T const& t, bool cond)
{
   ...
}

template <>
inline int A::f<int>(uint32_t, int const& t, bool cond)
{
   ....
}

最佳答案

对于初学者来说,通常不建议使用模板特化作为重载模板函数的方式。模板特化与函数重载的交互很差,并且在选择它们时有一些非常神秘的规则来规定,一般来说,人们认为只提供常规函数重载比特化函数模板更好。

在这种情况下,我建议您将类更改为如下所示:

class A {
public:
    template <typename T>
        int f(uint32_t id, T const& t, bool cond);
    int f(uint32_t id, int t, bool cond);
    ...
};

然后将您的模板特化更改为重载的实现。由于 C++ 函数重载的工作方式,这将更准确地选择函数的正确版本。

至于您的特定问题,您的代码并不总是调用重载的原因是 C++ 区分枚举类型和 int 类型。虽然有一些方法可以在 int 和枚举类型之间进行转换,但它们不是一回事,并且设计用于捕获 int 的重载不能保证捕获枚举类型以及。您最好专门重载函数来处理枚举的情况。

关于与枚举匹配的模板函数中的 C++ 无法解释的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4952916/

相关文章:

c++ - 不可预测的指针行为

C++ 模板转换运算符 - 请求从 到非标量类型的转换

python - 在我的 Django 模板中,如何显示复选框和通知类型?

c# - 将特定枚举反序列化为 Json.Net 中的 system.enum

c# - 枚举支持继承的位字段

java - 如何要求泛型参数是实现接口(interface)的枚举?

C++ - 如何将静态字典制作成查找矩阵

c++ - 移动局部变量时应该使用 std::move 吗?

c++ - 在 C++ 中定义发出警告

c++ - 为什么不对这些函数签名进行相同的处理?