从指向成员的指针进行模板推导,其中至少有一个指向成员的指针已知

2024-02-27

考虑一个具有接受指向成员函数的指针的静态方法模板的结构。请注意,当方法的参数之一是实际的指向成员函数的指针时,可以推导出两个模板参数,无论另一个参数是否是nullptr or not.

请参阅以下代码下面的问题:

struct Checker
{
    template <typename T, typename V>
    static void Check(
        V(T::*getter)(),
        void(T::*setter)(V)
    );

    template <typename T, typename V>
    static void CheckDefault(
        V(T::*getter)() = nullptr,
        void(T::*setter)(V) = nullptr
    );
};

struct Test
{
    int Value();
    void Value(int);

    int Getter();
    void Setter(int);
};

Checker::CheckDefault(&Test::Value);           //1
Checker::CheckDefault(&Test::Value, nullptr);  //2
Checker::Check(&Test::Value, nullptr);         //3

Checker::CheckDefault(&Test::Getter);          //4
Checker::CheckDefault(&Test::Getter, nullptr); //5
Checker::Check(&Test::Getter, nullptr);        //6
  • 为什么可以正确超载&Test::Value在1中确定,但在2和3中不确定?
  • 为什么 1 和 4 能够推导出正确的类型名,而 2、3、5 和 6 却不能?

Edit

我期望能够调用这些方法,并将两个参数中的至少一个设置为实际的指向成员函数的指针,从而使推导成功。就像这样:

Checker::Check(&Test::Value, &Test::Value); // Both getter and setter
Checker::Check(&Test::Value, nullptr); // Only getter
Checker::Check(nullptr, &Test::Value); // Only setter

Edit

@Oliv 的例外答案中的讨论解释了为什么它不能按我的预期工作,为我指明了解决特定问题的正确方向。

正如@Ben Voigt 建议的那样,我最终使用了转发器。就像是:

template <typename T, typename V>
using GetterT = V(T::*)();

template <typename T, typename V>
using SetterT = void(T::*)(V);

template <typename T, typename V>
void Checker::CheckGetterAndSetter(
    GetterT<T, V> getter,
    SetterT<T, V> setter
)
{
    // Do stuff with getter and setter.
}

template <typename T, typename V>
void Checker::CheckGetter(
    GetterT<T, V> getter
)
{
    SetterT<T, V> null = nullptr;
    return CheckGetterAndSetter(getter, null);
}

template <typename T, typename V>
void Checker::CheckSetter(
    SetterT<T, V> setter
)
{
    GetterT<T, V> null = nullptr;
    return CheckGetterAndSetter(null, setter);
}

TL;DR 它成功是因为默认参数不用于模板参数推导。在其他情况下(2,3,5,6),它会失败,因为nullptr_t没有 a 的形式T(U::*)(V)(甚至没有T*).

让我们举一个更简单的例子:

template<class T>
void f(T,T*=nullptr);
int main(){
  f(10,nullptr);// (1) error
  f(10);// (2) OK
  }

对于(1),编译器认为应该能够推导出T来自第一个参数和第二个参数,因为形式的参数T or T* are 免赔额. Since nullptr_t不是一个形状T*编译失败。

对于(2),编译器仅对函数的第一个参数执行模板实参推导,因为默认参数在模板参数推导中不起作用。所以它毫不含糊地推断出T is int。然后当函数被调用时,nullptr转换的 to a int*.

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

从指向成员的指针进行模板推导,其中至少有一个指向成员的指针已知 的相关文章

  • 在 Java 中创建 T 的新实例

    在C 中 我们可以定义一个泛型class A
  • 检测wlan是否关闭

    任何人都可以给我一个提示 如何在 Windows Phone 上以编程方式检测 C 8 1 应用程序 不是 8 0 是否启用 禁用 WLAN 我不想更改这些设置 只是需要知道 该解决方案是一个 Windows 8 1 通用应用程序 Wind
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 如何对 NServiceBus.Configure.WithWeb() 进行单元测试?

    我正在构建一个 WCF 服务 该服务接收外部 IP 上的请求并将其转换为通过 NServiceBus 发送的消息 我的单元测试之一调用Global Application Start 它执行应用程序的配置 然后尝试将 Web 服务解析为 验
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您

随机推荐

  • 定时器内存泄漏

    我正在使用一个在侦听器事件上取消并重新启动的计时器 除了计时器线程泄漏整个外部类之外 一切都工作正常 我的定时器实现如下 if timer null timer cancel timer null timer new Timer timer
  • Haskell:输入“putStrLn”时解析错误

    我刚刚编写了我的第一个 Haskell 程序 但有一个我无法理解的错误 我认为这是对的 因为我只是像书上的例子一样写的 有人可以帮我吗 main do putStrLn Hello what s your name name lt getL
  • 有趣的正则表达式 - 匹配字符数等于 2^n 的单词

    嘿 我一直在寻找有关正则表达式的反思主题 我想要一个正则表达式来匹配单词列表中包含 2 n 个字符的每个单词 其中 n 是自然数 为了简单起见 我们假设一个单词只是一个序列o我们还假设该列表由单词组成 后跟单词所包含的字符数 并用空格分隔当
  • Swift 3:单例的属性观察器

    我想知道是否有任何方法可以观察单例类的某个属性的变化 就我而言 对于 Realm 我有这样的东西 class User Object dynamic var name String dynamic var email String dyna
  • iOS8 照片框架:如何获取 PHAsset 的名称(或文件名)?

    我试图使用获取图像名称PHAssets 但我找不到文件名的元数据或任何获取图像名称的方法 有其他方法获取文件名吗 我知道这个问题已经得到解答 但我想我会提供另一种选择 extension PHAsset var originalFilena
  • 在视图中使用临时表

    我真的很想创建一个视图 我知道您不能在 MSSQL2005 视图中使用临时表 在不重写 sql 的情况下 我是否遗漏了任何明显的东西 备份计划是使用存储过程 Cheers select into temp from vwIncidents
  • 如何在Java中为Android设置HttpResponse超时

    我创建了以下函数来检查连接状态 private void checkConnectionStatus HttpClient httpClient new DefaultHttpClient try String url http xxx x
  • Jupyter 笔记本自动完成显示重复选项

    Jupyter notebook s autocomplete seems working but somehow it will show duplicate options for the method For example belo
  • 通过 CORS 使用 Ajax 请求在浏览器上设置 Cookie

    尝试实现 ajax 登录 注册过程 没有带有身份验证的刷新站点 使用 cookie 来保存状态 我以为我现在就可以了 但由于某种原因 浏览器在从服务器取回 cookie 后不会设置 cookie 有人可以帮忙吗 以下是请求和响应标头 Req
  • 使用mocktail包进行单元测试时,类型“Null”不是类型“Future”的子类型

    我们如何验证函数内的方法是否被调用 我这里有一个示例代码 class MockService extends Mock implements Service class MockRepository extends Mock impleme
  • 更改 Bootstrap 3 中折叠导航栏上的菜单顺序

    我有一个 Bootstrap 3 导航栏 有两个右对齐 ul 给我这个的部分 当移动菜单折叠时 我得到以下信息 我有两个与折叠菜单相关的问题 1 如何让按钮出现在折叠菜单的底部而不是顶部 2 如何更改折叠菜单中按钮的样式 而不影响水平菜单中
  • 如何有效地用逗号连接列表并在最后一个元素之前添加“and”

    我一直在经历自动化无聊的事情 http automatetheboringstuff com 并遇到了一个名为 Comma Code end of第4章 https automatetheboringstuff com chapter4 您
  • 调用 on_pause 时暂停计时器似乎不起作用(Kivy)

    在 Android 上 我尝试在调用 on pause 时暂停 update time 方法 并在调用 on pause 时恢复它 on resume 被调用 换句话说 我试图在应用程序最小化时暂停计时器 并在应用程序最小化时恢复计时器 已
  • 使用java的数字签名电子令牌的密钥库

    如何从数字签名电子令牌创建密钥库 如何创建密钥库的路径 如何使用java应用程序在任何文档中使用密钥库进行签名 加密硬件设备通常可以通过 PKCS 11 API 连接 您将需要 PKCS 11 库 Windows 上的 dll 或 Unix
  • 为什么 Joda 对象是不可变的?

    我读到 在 Java 版本低于 7 的情况下 Joda Time 对象比 Java 的内置对象更可靠 引用的一个原因是 Joda 对象是不可变的 为什么这有好处 如果我想更改 Joda DateTime 对象的年份 小时和时区 我需要制作三
  • 未定义的局部变量或方法“user_params”rails 4

    所以我遵循了 从头开始进行身份验证 的轨道演员 http railscasts com episodes 250 authentication from scratch http railscasts com episodes 250 au
  • 如何撤销 Kubernetes 中的客户端证书?

    我按照这篇文章了解了如何为 Kubernetes 集群中的用户设置 RBAC https medium com better programming k8s tips give access to your clusterwith a cl
  • 无法更改 标签的类别

    我试图找到页面上的所有标签并将其类从 multiimage 更改为 mySpace 但我在页面上看不到任何更改 当我将此元素登录到控制台时 我可以看到其 className 设置为 multiimage My code window onl
  • 通过 Django 管理中的内联显示编辑/添加外键对象

    我的 Complete Book 模型有一个 Book 的外键 书籍是我从已安装的应用程序中使用的东西 因此 外部应用程序 我希望能够直接从 Complete Book 管理员编辑 创建 书籍 这可能吗 我无法使用内联 因为我的外键关系与内
  • 从指向成员的指针进行模板推导,其中至少有一个指向成员的指针已知

    考虑一个具有接受指向成员函数的指针的静态方法模板的结构 请注意 当方法的参数之一是实际的指向成员函数的指针时 可以推导出两个模板参数 无论另一个参数是否是nullptr or not 请参阅以下代码下面的问题 struct Checker