如何区分模板与非类型参数的重载?

2023-11-27

这是两个模板函数,仅在模板参数上有所不同。其余参数完全相同。

    template<int module>
    void template_const(int &a,int & b){
            a = a & module;
            b = b % module;
    }

    template<bool x>
    void template_const(int &a,int & b){
            int w;
            if (x){
                    w = 123;
            }
            else w = 512;
            a = a & w;
            b = b % w;
    }

当我尝试这样称呼他们时

template_const<true>(a,b)

or

template_const<123>(a,b)

编译器告诉我该调用不明确。我该如何调用这两个函数呢?


正如 @jogojapan 指出的,问题在于编译器无法对这两个函数进行排序,即没有一个比另一个更专业。如第 14.5.6.2 节中所述,当对重载函数模板的调用不明确时,编译器会使用各种重载之间的偏序来选择最专业的一个。

为了对重载进行排序,编译器会转换它们中的每一个并执行模板参数推导,以查看其中一个是否比另一个更专业(在末尾有一个简短的解释)这个答案)。在您的情况下,两个重载是等效的(或不具有可比性):template<int> void template_const(int &,int &)并不比更专业template<bool> void template_const(int &, int &),反之亦然。

因此,编译器无法选择其中之一,从而生成一个ambiguous call error.


如果您可以明确指定要传递的参数的类型,则可以使用部分模板专业化,如下所示:

template<typename T, T param>
struct template_const_impl;

template <int module>
struct template_const_impl<int, module>
{
    static void apply(int &a, int &b)
    {
        a = a & module;
        b = b % module;
    }
};

template<bool x>
struct template_const_impl<bool, x>
{
    static void apply(int &a, int &b)
    {
        const int w = x ? 123 : 512;
        a = a & w;
        b = b % w;
    }
};

template <typename T, T param>
void template_const(int &a, int &b)
{
    return template_const_impl<T, param>::apply(a, b);
}

int main()
{
    int i = 512, j = 256;
    template_const<int, 123>(i, j);
    template_const<bool, true>(i, j);
}

这并不理想,但它认为没有更干净的解决方案,除非您可以使用 C++11 并愿意依赖一些宏,在这种情况下您可以稍微简化调用代码(想法取自@Nawaz)在这个答案):

#define TEMPLATE_CONST(x) template_const<decltype(x), x>

int main()
{
    int i = 512, j = 256;
    TEMPLATE_CONST(123)(i, j);
    TEMPLATE_CONST(true)(i, j);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何区分模板与非类型参数的重载? 的相关文章

随机推荐

  • setOnKeyListener 没有响应

    我是 Android 新手 正在研究书中的待办事项列表示例 我有一个 Activity 它显示一个 EditText 和一个在其下方的 ListView 有一个 onKey 事件应该将 EditText 中的文本添加到 ListView 并
  • Pandas 相当于 Oracle Lead/Lag 函数

    首先 我对熊猫还不熟悉 但我已经爱上了它 我正在尝试实现 Oracle 中的 Lag 函数的等效项 假设您有这个 DataFrame Date Group Data 2014 05 14 09 10 00 A 1 2014 05 14 09
  • Django 按日期或小时记录到文件

    我知道 django 可以记录到一个文件 但我想知道如何在不同的时间打印到不同的文件 文件名如20150101 log 20150102 log 两个问题 我可以通过以下方式实现吗LOGGING gt filename配置 如果Q1不能 我
  • 如何在 php 中验证 google play 应用内购买?

    我希望使用 php 页面通过 google play 验证应用程序中应用程序内购买的收据 我该怎么做呢 我不是 PHP 专家 所以我不会发布任何代码 但总体过程是very直接了当 移植到 PHP 应该非常容易 您需要三件事来验证购买 您的应
  • 有没有类似Python导出的东西?

    我们一直使用 python 的导入机制来导入模块 变量和其他东西 但是 有什么可以作为导出的吗 喜欢 我们从模块导入东西 from abc import 那么我们可以像这样导出吗 to xyz export 或者 将a b c导出到prog
  • 如何在 Java 中表示整数区间?

    我们都知道数学中的区间 例如 4 如何在 Java 中表示这些数学区间 例如 4 和 3 之间的数字 4 3 2 3 等 检查 apache commons langIntRange 因此 如果您想检查一个数字是否在给定的间隔 范围 内 您
  • 我使用 Django 应用程序在 heroku 中收到错误 R14(超出内存配额)

    我在 Heroku 平台上为 Django 应用程序运行 3 个测功机 它工作正常 1 5 年 两周以来 我经常收到错误 R14 超出内存配额 错误 我应该怎么做才能避免这个错误 我如何监控问题 2015 01 27T10 34 01 85
  • 类变量字典未在 python 2.7 中使用 pickle.dump 保存

    我正在使用 pickle 通过转储根来保存对象图 当我加载根时 它具有所有实例变量和连接的对象节点 但是 我将所有节点保存在字典类型的类变量中 类变量在保存之前已满 但在我解封数据后它是空的 这是我正在使用的类 class Page cra
  • 如何在 swift Xcode 中以编程方式绑定/配对蓝牙 LE 设备?

    我目前正在尝试开发一个应用程序 允许用户通过单击按钮绑定到外围设备 并且将自动输入密码 是否可以使用 swift 以编程方式绑定和删除绑定 每当您尝试写入或读取 BLE 设备上的特征时 都会启动配对 但是 如果设备未设置为需要身份验证和 或
  • jar 文件文件夹中的资源列表?

    通常我从 jar 文件中读取资源 如下所示 getClassLoader getResource pTextPath pLang xml 我需要从 jar 文件中的已知文件夹中读取具有特定名称的所有资源 例如 从以下位置读取 xml 插件
  • 使用哪种 Android 数据存储技术?

    Android 文档有以下选项 但没有解释每个选项最适合什么情况 每种方法的优点和缺点是什么 例如在什么情况下 SQL 会比共享首选项更好 共享偏好设置 内部存储器 外置储存 SQLite数据库 网络连接 Android 中的不同存储选项
  • 为什么可以使用字符串文字来初始化 unsigned char 数组,但不能初始化 unsigned char 指针?

    我尝试过编译gcc Wall pedantic errors std c89下面的代码 int main unsigned char a foo unsigned char b foo unsigned char c unsigned ch
  • 大写输入字段的指令

    我想使用指令将所有输入数据转换为大写 为了实现这一目标 我创建了这个自定义指令 Directive selector appToUpperCase export class ToUpperCaseDirective constructor
  • 如何将字符串和组件作为 prop 传递?

    我可以通过这样的罚款
  • 有没有办法同时运行 2 个 NSAnimation 对象?

    我创建了2个NSAnimation用另一个视图翻转视图的对象 我想同时运行 2 个这样的动画 我无法使用NSViewAnimation 因为现在是关于对任何视图属性进行动画处理 下面是动画创作 self animation Transiti
  • 同时进行相机预览和处理

    我正在设计一个具有 OpenGL 处理管道 着色器集合 的应用程序 同时要求最终用户看到未加工的相机预览 举个例子 假设您想要向用户显示相机预览 同时计算从相机接收到的场景中红色对象的数量 但是您用来计算对象的任何着色器 例如色调过滤 等等
  • 在 PHP 中获取多维数组的交集

    初始点 我有一个多维数组 如下例所示 array array role 1 gt array 0 gt value 2 1 gt value 3 role 2 gt array 0 gt value 1 1 gt value 2 role
  • 进行动态但方形布局的简单方法

    我正在使用一个GridView显示一堆视图 这些视图本质上是LinearLayouts 我想要LinearLayouts全部都是方形的 但我也希望它们的大小是动态的 也就是说 有两列 我想要LinearLayouts根据屏幕的大小进行拉伸
  • 在 OSX 上的 QT 中设置 OpenCV

    我正在尝试设置OpenCV跟 共事QT在 OSX 10 7 5 MacbookPro 2 5 Ghz Intel Core 2 Duo 上 我在这里看到了一些相关的问题 如何在QtCreator中链接opencv并使用Qt库 and 如何在
  • 如何区分模板与非类型参数的重载?

    这是两个模板函数 仅在模板参数上有所不同 其余参数完全相同 template