转换 T-s 时完美转发非 T 参数

2023-12-02

(这个问题源自这个答案)

我正在尝试调整一个蹦床函数,该函数当前仅传递可变数量的参数。

我想让它转换任何参数PyObject* pyob to Object{pyob},但转发所有其他参数。

So (void* self, int, PyObject*, float) -> (int, Object, float)

在该示例中,第一个self论证被剥夺了。这种事总是会发生。在其余参数中,其中一个参数的类型为PyObject*,因此需要转换为 Object。

这是函数:

template <typename T, T t>
struct trap;

template <typename R, typename... Args, R(Base::*t)(Args...)>
struct trap<R(Base::*)(Args...), t>
{    
    static R 
    call(void* s, Args... args)
    {
        std::cout << "trap:" << typeid(t).name() << std::endl;
        try
        {
            return (get_base(s)->*t)(std::forward<Args>(args)...);
        }
        catch (...)
        {
            std::cout << "CAUGHT" << std::endl;
            return std::is_integral<R>::value ? static_cast<R>(-42) : static_cast<R>(-3.14); 
        }
    }
};

它似乎不是转发参数。我认为它正在复制每个论点。我试过了:

call(void* s, Args&&... args) 

但这只会产生编译器错误。

完整的测试用例是here

如何修复函数以完美转发除类型之外的所有参数PyObject*,它应该转换哪个?


似乎没有转发参数

你不能完美向前函数的参数不是模板,或者是通过指向函数的指针调用的,就像您所做的那样。完美转发涉及一个模板实参推导,当您通过指针调用函数时不会发生这种情况 - 该指针指向具体实例化的函数模板。

The std::forward<Args>(args)表达式是有可能利用移动构造函数从这些参数中复制初始化目标函数的参数call那些通过的by value(或通过硬编码的右值引用),或者让它们由右值引用绑定 - 您将不再需要这些实例,您可以自由地移出他们,至少节省了一次复制操作。 (它可以像这样简单static_cast<Args&&>(args)...,因为它只是一个参考崩溃)。


我想让它转换任何参数PyObject* pyob to Object{pyob},但转发所有其他参数。如何修复函数以完美转发除类型之外的所有参数PyObject*,它应该转换哪个?

#include <utility>

template <typename T, typename U>
T&& forward_convert(U&& u)
{
    return std::forward<T>(std::forward<U>(u));
}

template <typename T>
Object forward_convert(PyObject* a)
{
    return Object{a};
}

// ...

return (get_base(s)->*t)(forward_convert<Args>(args)...);

替换任何出现的Object with PyObject*在创建签名时call函数,然后才有条件地转发或转换参数,您应该执行以下操作:

template <typename T>
struct replace { using type = T; };

template <>
struct replace<Object> { using type = PyObject*; };

// you may probably want some more cv-ref specializations:
//template <>
//struct replace<Object&> { using type = PyObject*; };  

template <typename T, T t>
struct trap;

template <typename R, typename... Args, R(Base::*t)(Args...)>
struct trap<R(Base::*)(Args...), t>
{    
    static R 
    call(void* s, typename replace<Args>::type... args)
    {
        try
        {
            return (get_base(s)->*t)(forward_convert<typename replace<Args>::type>(args)...);
        }
        catch (...)
        {
            return std::is_integral<R>::value ? static_cast<R>(-42) : static_cast<R>(-3.14); 
        }
    }
};

DEMO

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

转换 T-s 时完美转发非 T 参数 的相关文章

  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • gcc,我可以将 offsetof() 与指向成员的模板化指针一起使用吗?

    下面的代码在这里 https ideone com XnxAyw https ideone com XnxAyw 我得到的编译器错误是 prog cpp In member function size t list base
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • Git 和硬链接

    考虑到Git不能识别指向存储库之外的符号链接 那么使用硬链接有什么问题吗 Git 能破坏它们吗 你能指点我详细的信息吗 树 对象代表 Git 中的目录 存储文件名和 子集 权限 它不存储 inode 号 或其他类型的文件 ID 所以硬链接
  • Struts 2 和 Struts 2 jQuery 标签之间有什么区别?

    我是 Struts 2 的新手 我想知道 Struts 2 和 Struts 2 jQuery 标签之间的区别 第一个用于Struts2核心标签库 框架提供了与视图解耦的标签库 技术 在本节中 我们一般性地描述每个标签 例如它支持的属性 行
  • 如何在 KeyListener 中调用 Graphics 方法?

    提前 我想说有很多类似的帖子 但是 它们都不适用于我 或者实际上没有任何答案 并且已经过时了 这意味着可能会有新的 java 功能可以帮助我解决我的问题 不管怎样 我想制作一款有网球拍的游戏 当然 他们必须轮换 为了旋转 我必须在 KeyL
  • 关于此代码中 ::* 的含义 [重复]

    这个问题在这里已经有答案了 我正在刷新一些关于函数指针的被遗忘的概念 以创建某种包装类来处理回调调用 在谷歌浏览后 我发现了这个简单但有趣的帖子http blog coldflake com posts C delegates on ste
  • OnClick 更改表格行背景颜色

    因此 我试图找到一种简单的方法来在单击时更改背景颜色或表格行 我一直在尝试找到一种方法来调用背景颜色并检查它 但我还没有找到一种方法来调用颜色 这是我现在所拥有的 RowName TableRow findViewById R id Row
  • 如何在 Vue 中获取数据之前抑制“未定义”错误

    我有一个简单的页面 其中显示从服务器获取的一些数据 模板 p Order s customer name order customer name p JavaScript export default data return order m
  • 詹金斯错误“没有签名证书”

    当我使用 Jenkins aotoPackage 我的 iOS api 时 我遇到以下日志 构建目标 goldNews iOS 项目 goldNews iOS with CONFIGURATION Release 检查依赖关系 找不到签名证
  • NetworkStream.Read() 不起作用并抛出 ArgumentOutOfRangeException

    只是想创建一个聊天服务器客户端 这是等待客户端连接的服务器 可选 TcpListener serverSocket new TcpListener 8888 int requestCount 0 TcpClient clientSocket
  • Android Theme.NoTitleBar 不起作用

    我的应用程序中有一个类似 facebook 的滑动菜单栏 其中应用程序的两个内容和主要布局由自定义布局类处理 我想删除我的应用程序的标题栏 Issue 尽管我放置 android Theme Light NoTitleBar 在我的清单中
  • ifstream 无法打开文件

    我正在尝试打开一个文件 以便从中读取内容 include
  • Python lxml:在相对于子元素的给定位置插入文本

    我想构建以下 XML 元素 为了自定义数字格式
  • 从 BroadcastReceiver 启动 Activity

    我有以下代码从扩展的类发送电子邮件BroadcastReceiver Intent emailIntent new Intent android content Intent ACTION SEND S2Mconfig s2m new S2
  • 从 CPP 中的字符串中删除重复项

    我编写了以下代码 用于从给定字符串中删除重复项 即如果 ARRUN 是输入 则输出将为 ARUN include
  • JavaScript 模板引擎? [复制]

    这个问题在这里已经有答案了 可能的重复 JavaScript 中的模板引擎如何工作 我已经开始学习 Javascript 并阅读了网络上的各种不同文章 我不太确定的一件事是 javascript 模板引擎是什么 他们的目的是什么 如果有人能
  • IOS 5 使用buzztouch应用程序在静音模式下播放视频时没有音频

    我已经用buzztouch为Iphone和Ipad开发了几个应用程序 这里以一个免费的为例 http itunes apple com us app lr basics free edition id497563707 mt 8 我不太了解
  • 如何判断一个字符串是否包含整数?

    假设您有一个字符串 您想要测试它以确保它包含一个整数 然后再继续执行其余代码 在java中 你会用什么来判断它是否是一个整数 如果您想确保它是only一个整数并将其转换为一 我会使用parseInt in a try catch 但是 如果
  • iOS 从一年中的某一天获取日期

    stackoverflow 上的常见问题是如何从日期获取一年中的某一天 但是如何从一年中的某一天获取日期呢 我使用以下代码来生成一年中的某一天 但如何执行相反的操作 Calculate Day of the Year NSCalendar
  • 水平 ListView.builder 上的 RefreshIndicator

    我有一个水平 ListView builder 小部件 我想在将其向左拉时使用 RefreshIndicator 进行刷新 FutureBuilder future initGetTopX builder context wikiSnaps
  • removeAllObjects 和 NSMutableArray 的释放是否具有相同的功能?

    我写了以下代码行 NSMutableArray array NSMutableArray alloc init 这会分配一些内存 我的问题是 我们以后如何释放这块内存 是使用removeAllObjects方法还是 数组释放 这两种方法具有
  • 转换 T-s 时完美转发非 T 参数

    这个问题源自这个答案 我正在尝试调整一个蹦床函数 该函数当前仅传递可变数量的参数 我想让它转换任何参数PyObject pyob to Object pyob 但转发所有其他参数 So void self int PyObject floa