首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何实现只有c++98特性的std::result_of?

实现只有C++98特性的std::result_of可以通过以下步骤:

  1. 首先,我们需要了解std::result_of的概念。std::result_of是一个函数模板,用于获取函数调用的返回类型。在C++11及以后的标准中,可以使用std::result_of来获取函数调用的返回类型。但在C++98中,没有提供std::result_of,因此我们需要手动实现一个类似的功能。
  2. 在C++98中,我们可以使用函数指针和函数对象来模拟函数调用。我们可以定义一个模板类result_of,该类接受一个函数类型和函数参数类型,并提供一个成员类型result,用于表示函数调用的返回类型。
代码语言:cpp
复制
template <typename Func, typename Arg>
struct result_of {
  typedef typename Func::template result<Arg>::type result;
};

在上述代码中,我们使用模板参数Func表示函数类型,使用模板参数Arg表示函数参数类型。通过调用Func的result模板成员,我们可以获取函数调用的返回类型。

  1. 接下来,我们需要定义一个函数对象,该函数对象包含一个模板成员result,用于获取函数调用的返回类型。
代码语言:cpp
复制
template <typename T>
struct function_object {
  template <typename Arg>
  struct result {
    typedef typename T::template result<Arg>::type type;
  };
};

在上述代码中,我们使用模板参数T表示函数类型。通过调用T的result模板成员,我们可以获取函数调用的返回类型。

  1. 最后,我们可以使用上述定义的result_of类和function_object类来实现只有C++98特性的std::result_of。
代码语言:cpp
复制
template <typename Func, typename Arg>
struct result_of {
  typedef typename Func::template result<Arg>::type result;
};

template <typename T>
struct function_object {
  template <typename Arg>
  struct result {
    typedef typename T::template result<Arg>::type type;
  };
};

// 示例用法
struct MyFunc {
  template <typename Arg>
  struct result {
    typedef int type;
  };
};

typedef result_of<function_object<MyFunc>, int>::result ResultType;

在上述示例中,我们定义了一个函数类型MyFunc,该函数类型返回类型为int。通过使用result_of类和function_object类,我们可以获取函数调用的返回类型,并将其定义为ResultType。

这样,我们就实现了只有C++98特性的std::result_of。请注意,这只是一个简单的示例,实际使用中可能需要根据具体情况进行调整和扩展。

腾讯云相关产品和产品介绍链接地址:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【C++11】消除重复, 提升代码质量---type_tratis

D: true 1.4 获取可调用对象返回类型traits std::result_of可以在编译器获取可调对象返回类型,帮助解决编码过程中如下问题: 函数入参为模板参数,不能直接确定函数返回类型...; 通过decltype推导函数返回类型时可读性差问题; 使用后置推导类型时,如果没有构造函数导致编译报错问题; std::result_of原型如下: template <class Fn, class...'Fun(int)' std::enable_if实现了根据条件选择重载函数规则,其原型如下: template struct enable_if...使用std::enable_if可以实现一个强大重载机制,充分利用可以减少或者消除圈复杂度。如:根据不同数据基本类型转换为string进行输出。...::string).name()) { return std::to_string(t); } return "null"; } 上面的代码为了实现基本数据类型转换

1.7K10

【C++修炼之路】26.C++11(语法糖)

相比于C++98/03,C++11则带来了数量可观变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷修正,这使得C++11更像是从C++98/03中孕育出一种新语言。...C++11增加语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本节主要讲解实际中比较实用语法。...也可以作为operator=参数,这样就可以用大括号赋值。因此我们就知道了为什么vector类空间是如何初始化,vector构造函数就存在std::initializer_list参数。...那再来回顾一下当初模拟实现vector,由于我们并没有设置std::initializer_list构造,因此采用大括号进行初始化是错误,所以我们可以多重载一个由std::initializer_list...C++11中废弃auto原来用法,将其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象类型设置为初始化值类型。 实际上在C++初窥门径中已经学习过。

40800

Effective Modern C++翻译(1):序言

所以,有很多东西需要学习,更重要是,去学习如何有效率使用这些新特性,如果你需要有关现代C++基本语法和语义特性信息,你可以找到大量资料,但是你如果想要找到一些指导方针,关于如何利用这些新特性来创造那些正确...,有效率,可维护,可移植软件的话,这会是一个更有挑战事情,而这就是这本书目的,它致力于如何有效率使用那些C++11和C++14特性,而不只是单纯描述这些特性。...如何使用std::unique_ptr实现pimpl?为什么你在使用lambda表达式时应该避免默认变量捕捉形式?或者是std::atomic和volatile区别和如何正确使用它们?...C++里很多东西可以被声明和定义,声明给出了它名字,却没有给出太多细节,比如它储存空间和它是如何实现。...定义提供了它储存空间和它实现细节。

1.2K90

云课五分钟-0B快速排序C++示例代码-注释和编译指令

记住,编程是一项需要不断实践和学习技能,只有持之以恒地努力,才能不断提升自己水平。祝你在LeetCode学习中取得好成绩!...当你在编译 C++ 代码时使用 -std=c++11 选项,你告诉编译器使用 C++11 标准来解析和编译你代码。这样,你就可以在代码中使用 C++11 引入特性和语法。...确保在使用 C++11 特性时在编译器中指定 -std=c++11 选项,以确保代码正确解析和编译。 -std=c++11 是一个编译器选项,用于指定编译器使用 C++11 标准来编译代码。...当你在编译 C++ 代码时使用 -std=c++11 选项,你告诉编译器使用 C++11 标准来解析和编译你代码。这样,你就可以在代码中使用 C++11 引入特性和语法。...确保在使用 C++11 特性时在编译器中指定 -std=c++11 选项,以确保代码正确解析和编译。

14010

C++关键字——noexcept

C++98起,异常处理机制已成为C++一部分,通过throw关键字抛出异常,而try-catch块则用于捕获并处理这些异常。...然而,在C++98时代,异常处理设计理念较为严格,捕获语句无法捕获未知异常,进而要求函数修改异常时,调用该函数父类函数异常捕获语句也需要做出适配性修改,否则异常捕获语句失效。...int m_age{ 0 }; }; 原理剖析 noexcept保证函数不会发射异常,那么noexcept是如何保证呢?...正是由于其不向外发射异常特性,为编译器提供了更大舞台。...使用“能移动则移动,必须拷贝再拷贝”策略来提升性能。 注意事项 只有在时间维度上恒为不发射异常函数才可标注为noexcept,否则不要做出该函数noexcept假设。

10210

【笔记】《深入理解C++11》(上)

, POD 库编程: 内联命名空间, 继承构造, 右值引用 C++11标准设计准则: 在稳定性和兼容性之间抉择: auto, using, nullptr 用库而非扩展语言语法来实现特性: std::...regex, 库尽量以头文件实现, 但也有并行库这种必须深入编译器库 用通用而非特殊手段来实现特性: 显式类型转换 让特性对专家和新手都适用: 统一初始化表达式 增强类型安全: enum class...如果在代码中看到了大量std::enable_if, 那么要想到这是和SFINEA相关模板编程特性....std::cout ::value << std::endl; // 输出 true } 这个特性在C++20中被concept以更好语法取代 4..., 所以不会降低效率 标准库中std::result_of()内部type命名本质就是decltype decltype有所谓推导四原则: 如果目标是一个没有带括号标记符表达式(也就是除去关键字

1.9K20

【C++航海王:追寻罗杰编程之路】C++11(一)

不过由于C++03(TC1)主要是对C++98标准中漏洞 进行修复,语言核心部分则没有改动,因此人们习惯性把两个标准合并称为C++98/03标准。...相比于 C++98/03,C++11则带来了数量可观变化,其中包含了约140个新特性,以及对C++03标准中 约600个缺陷修正,这使得C++11更像是从C++98/03中孕育出一种新语言。...2 -> 统一列表初始化 2.1 -> {}初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一列表初始值设定。...dict = { {"sort", "排序"}, {"insert", "插入"} }; // 使用大括号对容器赋值 v = { 10, 20, 30 }; return 0; } 让模拟实现...C++11中废弃auto原来用法,将 其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象类型设置为初 始化值类型。

6210

C++ 实用指南

例如,C++ 标准页数从 C++98/03 879 页增加到了 C++20 1834 页,多了近 1000 页!更重要是,C++ 每次修订后,我们都会获得几十个新特性。...只有在极少数情况下,你才需要主动去澄清并充分理解它们。(模板化库编写、热路径等)。大多数时候 C++ 并不比 java 或其他东西复杂。可悲是大多数人都忘了这一点。...你在这种语言上遇到主要问题都有哪些? 到目前为止,我们已经讨论了一些问题……那么如何应对它们呢?有机会解决这些问题吗? 如何保持理智 没有完美的编程语言;每种语言都有一些问题。...不过,如果你不需要走那么远,你可以停留在相对较高抽象级别。 例如,你不需要编写可选类型,因为你可以使用标准库中std::optional。...同样,高级元编程内容也可能不是你代码关键部分。 增量变更 如果你是从头开始或只有一个小代码库,那么转到 C++11/14 应该相对容易一些。可是 20 年(或更久!)

51320

C++17, 语言核心层有哪些新变化?

The big picture 从 C++98 到 C++14,图中只列出了较大特性要点.图中也缺少了关于 C++03 特性描述, 因为C++03标准非常小,内容上更多是为了修复 C++98 一些缺陷....如果你熟悉C++,那么你一定知道 C++98(第一个C++标准) 和 C++11 是两个非常大C++标准, 但C++14,特别是C++03则是两个小标准....我们继续来看看编译期改动 constexpr if constexpr if 可以实现源代码条件编译. template auto get_value(T t) { if...::cout << std::endl; return 0; } 22行和23行代码从C++第一个标准开始(C++98)便是合法,但是25行及26行代码则只能在C++17中编译通过,因为在C++17...除了功能特性,C++17中还有一些旨在提升代码运行效率特性. guaranteed copy elision RVO是返回值优化(Return Value Optimisation)简称,他作用是允许编译器移除一些不必要复制操作

80120

【C++】C++11特性 --- 列表初始化,auto关键字,decltype关键字

1 C++ 11介绍 在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前最新C++标准名称。...不过由于C++03(TC1)主要是对C++98标准中漏洞进行修复,语言核心部分则没有改动,因此人们习惯性把两个标准合并称为C++98/03标准。...相比于C++98/03,C++11则带来了数量可观变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷修正,这使得C++11更像是从C++98/03中孕育出一种新语言。...接下来我将通过几篇文章来介绍一下C++11中重要特性! 2 列表初始化 在C++11中加入了initializer_list标准库类型,用于表示某种特定类型数组。...C++11中废弃auto原来用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象类型设置为初始化值类型。

8310

【C++】如何巧妙运用C++命名空间:初学者必备指南

本篇将带领大家走进C++旅途,为了更好地学习C++这门语言,我们需要了解它前世今生。在了解完C++如何诞生后,将开始我们C++之旅第一站"命名空间"。...但是:现在公司主流使用还是C++98和C++11,所有大家不用追求最新,重点将C++98和C++11掌握好。等工作后,随着对C++理解不断加深,有时间可以去琢磨下更新特性。...B程序员做了个Push函数实现压栈功能,而C程序员做了Push函数实现插入元素功能,在A公司所定义命名空间,出现名称冲突问题,对此需要B和C程序员定义自己命名空间存放自己数据。...return 0;}其中关于cout和cin还有很多更加复杂用法,这里就不展开学习早期标准库将所有功能在全局域中是实现,声明在.h后缀头文件中,使用时只需包含对应头文件即可,后来将其实现std命名空间下...方式六、std命名空间使用惯例std是C+标准库命名空间,如何展开std使用更加合理呢?

15610

C++11简单介绍(上)

不过由于C++03(TC1)主要是对C++98标准中漏洞进行修复,语言核心部分则没有改动,因此人们习惯性把两个标准合并称为C++98/03标准。...相比于C++98/03,C++11则带来了数量可观变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷修正,这使得C++11更像是从C++98/03中孕育出一种新语言。...C++11增加语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本篇博文主要讲解实际中比较实用语法。...::move(s1); return 0; } 6.可变参数模板 C++11特性可变参数模板能够让您创建可以接受可变参数函数模板和类模板,相比C++98/03,类模版和函数模版中只能含固定数量模版参数...我们无法直接获取参数包args中每个参数,只能通过展开参数包方式来获取参数包中每个参数,这是使用可变模版参数一个主要特点,也是最大难点,即如何展开可变模版参数。

9910

【C++修炼之路】28.新类功能

::move(s1); Person s4; s4 = std::move(s2); return 0; } 如果打开注释任意一个或者都打开: 2....强制生成默认函数关键字default 如果需要写析构函数,此时移动构造就不会默认生成,因此可以使用default强制生成移动构造: // 以下代码在vs2013中不能体现,在vs2019下才能演示体现上面的特性...::move(s1); return 0; } 4.禁止生成默认函数关键字delete 如果能想要限制某些默认函数生成,在C++98中,是该函数设置成private,并且只声明补丁已,这样只要其他人想要调用就会报错...就拷贝构造来说: c++98方式: 对于c++98来说,将构造函数写出并放在私有,这可以防止外部调用拷贝构造,但是不能防内部;但在类中只声明不实现,声明为私有同样可以防止内部。...class A { public: A() {} ~A(){ delete[] p;} private: //只声明不实现,声明为私有 C++98 A(const A& aa);//浅拷贝

26500

C++11『基础新特性

前言 自从C++98以来,C++11无疑是一个相当成功版本更新。它引入了许多重要语言特性和标准库增强,为C++编程带来了重大改进和便利。...即 C++03,但因此人们总是习惯性C++98/03 看作一个标准,多年以来,C++98/03 标准是市面上主要被使用 C++ 版本 C++标准委员会 计划在 2007 年发布下一个语法版本,并计划命名为...来说,带来了数量可观变化, 其中包含了约 140 个新特性,以及对 C++98/03 中约 600 个缺陷修正,这就使得 C++11 更像是一次变革,变成了一种 “新语言”(因为 C++11 中部分操作显得很不...---- 位于 vector 类(自己模拟实现) // 供列表初始化调用 vector(const std::initializer_list& init) { typename std...forward_list 只有一个指针,节省空间,同时头部操作效率不错,但是我们日常中都是不缺内存,所以 list 会更加方便 至于 unordered_map 和 unordered_set 就不再细谈了

24140
领券