C++中获取返回值的类型

2023-11-22

假设我们有一个函数f它返回一个未知类型的值(我们称之为T) 并采用类型的值T作为一个论点(可能还有一些其他论点)。我如何获得返回类型f在 C++14 中?

如果我们知道参数类型,就有一种方法可以做到这一点(通过std::result_of)。如果我们知道除T?

例子:

template <class F> // F is functor with   T operator()(T a, T b)
class A {
    // Here I want to do
    // T some_function(T some_arg) { ... }
}

template <typename T>
struct return_type;

template <typename R, typename... Args>
struct return_type<R(Args...)> { using type = R; };

template <typename R, typename... Args>
struct return_type<R(*)(Args...)> { using type = R; };

template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...)> { using type = R; };

template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) &> { using type = R; };

template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) &&> { using type = R; };

template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) const> { using type = R; };

template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) const&> { using type = R; };

template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) const&&> { using type = R; };

template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) volatile> { using type = R; };

template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) volatile&> { using type = R; };

template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) volatile&&> { using type = R; };

template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) const volatile> { using type = R; };

template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) const volatile&> { using type = R; };

template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) const volatile&&> { using type = R; };

template <typename T>
using return_type_t = typename return_type<T>::type;

Test:

#include <type_traits>

struct Functor
{
    int operator()(int i, int j) { return i + j; }
};

template <class F>
struct A
{
    using T = return_type_t<decltype(&F::operator())>;

    T some_function(T some_arg) { return some_arg; }
};

int main()
{
    A<Functor> a;
    static_assert(std::is_same<decltype(a.some_function(1)), int>::value, "!");
}

DEMO

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

C++中获取返回值的类型 的相关文章

  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我

随机推荐

  • C# Linq 列名称作为变量

    我有一个表 我想在其中对变量列进行查询 喜欢 private void query string column string value using var db new myDB var s1 from c in db Component
  • 在 Hive 中连接日期范围内的表

    我需要在employee id上 将tableA连接到tableB 并且表A中的cal date需要在表B的开始日期和结束日期之间 我运行了下面的查询并收到了下面的错误消息 请您帮我纠正和查询 谢谢你的帮助 JOIN date start
  • HTML/CSS 中的进度条

    dd position relative IE is dumb display block float left width 500px height 16px margin 0 0 2px background url white3 gi
  • 使用 Scrapy 使用“加载更多”按钮抓取无限滚动页面

    如何废弃一个无限滚动的网页 其中响应是 html text 而不是 json 我的第一次尝试是使用 Rule 和 LinkExtractor 它为我提供了大约 80 的职位 url class JobsetSpider CrawlSpide
  • 角度路径参数中的正斜杠

    如何设置我的路线 以便我的参数可以采用正斜杠 例如 myapp com file rootfolder subfolder myfile 这不起作用 const SECTION ROUTES Routes path file path co
  • 使用 Node JS 进行 HLS 流式传输

    我正在尝试使用 node js 流式传输 HLS 内容 但不知怎的 它不起作用 如果有人帮助我 那将会有很大的帮助 问题 尝试从 node js 提供 HLS 内容 不是直播 而是一组 ts 文件和 m3u8 播放列表 或者换句话说 VOD
  • 为什么 Createfile() 没有二进制标志

    Windows 编程的一大乐趣就是记住在所有文件打开调用中放入 wb 或 rb 或 ios binary 这样 Windows 就不会愉快地转换所有 0x13 我只需转换一堆很好的标准代码来使用 Createfile 来获取某个标志 我突然
  • Scala 泛型类的条件方法,具有类型参数的限制

    我相信泛型类可能仅在假设其类型参数符合一些附加限制的情况下才使其方法之一可用 例如 现场即兴编写的语法 trait Col T extends Traversable T def sum T lt Int T 0 this 我想我可以使用隐
  • 如何添加 SOAP 安全标头

    我读了很多文章和答案 但我无法解决 我在我的项目中使用 NET Framework 4 0 因此 我首先将 WebService 添加为服务引用 并在 app config 上获取绑定 我将列出我的尝试 尝试 1 我像这样实例化了服务并添加
  • 无法使用 Visual Studio 2015 命令行工具编译和链接简单的 C++ 程序

    使用 Visual Studio 2015 我无法再使用命令行工具编译和链接简单的 C 程序 考虑 main cpp include
  • Geochart:使用 ISO 3266-2 区域代码但显示真实姓名

    我正在使用Google 可视化 Geochart API创建一个国家地区的地图 我提供ISO 3266 2 国家细分代码并得到正确的结果 然而 在图表中将 ISO 3266 2 代码显示为标签是一种糟糕的用户体验 所以我想提供一个自定义标签
  • 使用代码启动 Photoshop 操作

    是否可以使用代码启动 Photoshop 操作 我的意思是通过批处理文件在 Photoshop 中启动该操作 或类似的东西 较新版本的 Photoshop CS5 和 CS6 是我使用过的唯一版本 支持一项称为Droplets它允许您创建可
  • 是否可以将 MyBatis 和 QueryDSL/jOOQ 结合起来?

    MyBatis 提供开箱即用的映射 本地缓存和日志记录 QueryDSL jOOQ 提供 SQL 语句的编译时检查和 IDE 自动完成功能 是否可以将它们结合起来 换句话说 我想使用 QueryDSL 或 jOOQ 创建一个查询 然后使用
  • java:字符串数组列表并删除

    在这样的测试中 Test public void test List
  • 强制 Flex 更新屏幕?

    这可能是一个初学者的问题 但我一生都无法弄清楚 我正在使用 Flex 为一个大型项目开发 GUI 特别是底部的状态栏 在我的 StatusBar 类中是一个 ProgressBar 其他正在工作的类可以告诉它在进展时更新 更改栏完成和标签
  • 登录表单是否需要令牌来抵御 CSRF 攻击?

    据我目前所知 令牌的目的是防止攻击者伪造表单提交 例如 如果网站有一个表单将添加的商品输入到您的购物车 那么攻击者可能会向您的购物车发送您不想要的商品 这是有道理的 因为购物车表单可能有多个有效输入 攻击者所要做的就是知道网站正在销售的商品
  • SignalR 中心中每个 web-api 请求的简单注入器依赖项

    根据this发布后 应该可以将每个网络请求的依赖项注入 SignalR 集线器 尽管有一些限制 例如 OnDisconnected 方法的问题 就我而言 它是 ASP Web API 不是 MVC 但由于某种原因它不起作用 以下是相关部分
  • swift 如何删除可选字符串字符

    如何删除可选字符 let color colorChoiceSegmentedControl titleForSegmentAtIndex colorChoiceSegmentedControl selectedSegmentIndex p
  • 如何让 Cucumber/Capybara/Mechanize 与外部非轨道站点一起工作

    我正在尝试在 Google 应用程序脚本上执行 BDD 我知道原则上我应该能够使用 Cucumber Capybara 和 Mechanize 的某种组合在非 Rails 外部站点上执行 BDD 在本例中 我尝试测试我创建的 Google
  • C++中获取返回值的类型

    假设我们有一个函数f它返回一个未知类型的值 我们称之为T 并采用类型的值T作为一个论点 可能还有一些其他论点 我如何获得返回类型f在 C 14 中 如果我们知道参数类型 就有一种方法可以做到这一点 通过std result of 如果我们知