首页
学习
活动
专区
工具
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++初窥门径中已经学习过。

    41800

    列表初始化:轻量级对象initializer_list

    C++发展历史 C++11是C++语言第二个主要版本,也是自C++98以来最重要一次更新。它引入了大量特性,标准化了已有的实践,并极大地改进了C++程序员可用抽象能力。...const Date& d2 = {2024, 7, 25};:引用一个临时Date对象,该对象由列表初始化创建。 Date d3 = {2025};:当只有一个参数时,列表初始化也可以使用。...例如,要初始化一个std::vector对象并赋予多个初始值,可能需要多次调用push_back,或者手动实现多个构造函数来支持不同数量参数。...std::vector v; v.push_back(1); v.push_back(2); v.push_back(3); // 或者手动实现多个构造函数来支持不同数量参数 为了解决这个问题..._length:表示元素数量。 特性 只读容器:std::initializer_list是一个轻量级只读容器,不能修改其中元素。 自动推导类型:可以通过auto关键字自动推导类型。

    20510

    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 选项,以确保代码正确解析和编译。

    14910

    C++关键字——noexcept

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

    16110

    C++奇迹之旅:列表初始化和std::initializer_list(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增加语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本节课程主要讲解实际中比较实用语法。...统一列表初始化 {}初始化 在C++98中,标准允许使用花括号{}对数组或者结构体元素进行统一列表初始值设定。...endl; map dict = {{"sort","排序"},{"Insert","插入"},{"Find","查找"}}; return 0; } 让模拟实现

    8810

    【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原来用法,将 其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象类型设置为初 始化值类型。

    7010

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

    52220

    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)简称,他作用是允许编译器移除一些不必要复制操作

    83020

    【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原来用法,将其用于实现自动类型推断。这样要求必须进行显示初始化,让编译器将定义对象类型设置为初始化值类型。

    9910

    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特性可变参数模板能够让您创建可以接受可变参数函数模板和类模板,相比C++98/03,类模版和函数模版中只能含固定数量模版参数,可变模版参数无疑是一个巨大改进。...我们无法直接获取参数包args中每个参数,只能通过展开参数包方式来获取参数包中每个参数,这是使用可变模版参数一个主要特点,也是最大难点,即如何展开可变模版参数。

    9810

    【C++创新性】C++11语法颠覆你认知了吗?

    不过由于C++03主要对C++98标准中漏洞 进行修复,语言核心部分则没有改动,因此人们习惯性把两个标准合并称为C++98/03标准。...相比于 C++98/03,C++11则带来了数量可观变化,其中包含了约140个新特性,以及对C++03标准中 约600个缺陷修正,这使得C++11更像是从C++98/03中孕育出一种新语言。...C++11增加语法特性非常篇幅非常多,我们这里没办法一 一讲解,所以本节课程 主要讲解实际中比较实用语法。...C++11中废弃auto原来用法,将其用于实现自动类型腿断。这样要求必须进行显示初始化,让编译器将定义对象类型设置为初始化值类型。...C++11中,std::move()函数位于 头文件中,该函数名字具有迷惑性,它并不搬移任何东西,唯一功能就是将一个左值强制转化为右值引用,然后实现移动语义。

    5910
    领券