成员函数特征

2024-01-19

我正在编写一个模板类,它包装成员函数以减少一些调用 - 如果某些条件为真,则不需要调用成员函数。签名看起来像这样

template <typename MemFuncType, MemFuncType> class MemberWrapper;

我可以这样专门化它:

template <typename R, typename T, R T::* MemFunc> class MemberWrapper<R T::*, MemFunc>{};

我还想限制参数的数量R T::*。我该怎么做呢?

我能想到的唯一解决方案是通过提供基于返回类型、函数类型、参数列表和 cv 限定符的部分特化来实现成员函数特征类。这将导致像当前的那样繁琐的实施std::mem_fn 超载 http://en.cppreference.com/w/cpp/utility/functional/mem_fn。有没有办法做得更好?

编辑:已更改Ret to R。正如评论中所指出的,它实际上不是返回类型,并且专业化无效。


不要尝试将所有内容都放入一个类中。成员函数是属于类的成员的函数。因此,首先创建一些函数特征类,例如

template< typename T >
class function_traits
{
  static_assert( sizeof( T ) == 0,
                 "function_traits<T>: T is not a function type" );
};

template< typename R, typename... Ts >
struct function_traits< R( Ts... ) >
{
  constexpr static const std::size_t arity = sizeof...( Ts );
  using result_type = R;
};

template< typename R, typename... Ts >
struct function_traits< R( Ts... ) const > : function_traits< R( Ts... ) > {};

template< typename R, typename... Ts >
struct function_traits< R( Ts... ) & > : function_traits< R( Ts... ) > {};

template< typename R, typename... Ts >
struct function_traits< R( Ts... ) const & > : function_traits< R( Ts... ) > {};

template< typename R, typename... Ts >
struct function_traits< R( Ts... ) && > : function_traits< R( Ts... ) > {};

template< typename R, typename... Ts >
struct function_traits< R( Ts... ) const && > : function_traits< R( Ts... ) > {};

这样,您可以轻松限制类中参数的数量:

template <typename Ret, typename T>
class MemberWrapper<Ret T::*>
{
  static_assert( function_traits<Ret>::arity <= 4,
                 "More than 4 arguments are not allowed" );
};

实例 http://coliru.stacked-crooked.com/a/c1313cb6abf4ae99

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

成员函数特征 的相关文章

随机推荐

  • 如何在 Windows 7 上安装 ora2pg?

    我下载了 zip 文件 该文件可以在线免费下载 但我无法安装下载的文件并运行该文件 任何人都可以帮我在我的 Windows 计算机上安装 ora2pg 简介 我必须将一些表从 Oracle 数据库迁移到 PostgreSQL 以便我的本地开
  • VS2012 服务器资源管理器 - 无法访问 Windows Azure 存储

    我有 VS2012 Ultimate SP3 和 Windows Azure 帐户 我已经发布了一个 MVC 3 应用程序 使用 Azure SQL Server DB 没有出现任何问题 我已经安装了Azure SDK v2 1 并且可以通
  • HttpClient.GetAsync(url) 将 504 返回到在浏览器中工作的 URL

    我可以手动访问 URL 但在使用 Net 时出现超时 我创建了一个按钮来更轻松地复制场景 有时我会收到一个异常 提示任务已取消 否则会出现 504 错误 代码片段如下 private async void Button Click 1 ob
  • vim 从 .vimrc 运行时无法打开文件,但从终端运行时可以正常打开

    每当我尝试使用 Vim 打开任何文件时 我都会收到以下错误消息 Error detected while processing home emma vimrc line 138 E484 Can t open file home emma
  • 左倾红黑树的 F# 代码优化

    我一直致力于将 LLRBT 的 C 实现移植到 F 现在它可以正确运行 我的问题是我将如何优化它 我的一些想法 使用 Node 的可区分联合来删除 null 的使用 Remove getters and setters 你不能同时拥有 nu
  • 如何将加载的图像读取到 blob 中? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将图像对象转换为二进制 blob https stackoverflow com questions 13375333 how to convert an image object to a bi
  • Scala 中的理解评估很奇怪(?)

    现在 我花了a while找出为什么我的递归会以某种方式设法破坏堆栈 这是导致此问题的部分 scala gt for i lt List 1 2 3 j println why am I evaluated 10 if false yiel
  • Google App Engine 数据存储区和其他 NoSQL 数据库的无架构设计指南

    我相信许多其他人都有关系数据库背景 因此我正在寻找一些可靠的指南来在 Google App Engine 上设置 设计我的数据存储区 人们对于设置此类无模式数据存储有什么好的经验法则吗 我了解一些基础知识 例如非规范化 因为您无法进行连接
  • 静态库调试符号

    在 VS2010 中 有一个选项可以为 exe dll 生成调试信息linker但下没有这样的选项图书管理员对于库 调试信息是否嵌入静态库中 里面有一个选项C C 属性为程序数据库文件名对于库 exe 和 dll 默认情况下 它进入我的中间
  • 使用flutter打印包,如何从URL打印PDF?

    我在flutter中使用打印包 https pub dev packages printing https pub dev packages printing 该文档展示了如何从头开始创建 PDF 我已经在 URL 上有一个 PDF 有没有
  • os.environ 对 C 扩展模块的可见性

    如果我使用更改环境变量os environ 我之后导入的模块会看到这种变化吗 具体来说 sqlite3 requires https stackoverflow com a 23251896 336527使用环境变量来确定其临时文件位置 但
  • 当 URL 不正确时,curl_easy_perform 崩溃

    我在尝试使用下载文件时遇到问题libcurl 该程序使用多个线程 每个需要下载文件的线程都会创建一个libcurl处理来工作 当 URL 正确时 一切正常 但如果 URL 错误 程序就会崩溃 在调试模式下 如果 URL 不正确curl ea
  • 如何将弹出框 MATERIAL-UI 功能组件转换为基于类的组件?

    我正在尝试将此功能组件转换为基于类的组件 我已经尝试了几个小时但找不到放置这些的位置const组件中的变量 如果有人可以将其写在基于类的组件中 我们将不胜感激 const useStyles makeStyles theme gt typo
  • MIPS 汇编:从整数转换为十六进制

    我发现这个代码片段我认为可以将整数转换为十六进制 然而 我根本不遵循它 我添加了一些评论 说明了我认为正在发生的事情 但我不知道为什么要这样做 那么 假设我正确地注意到每行正在做什么 有人可以向我解释为什么要这样做吗 至于它如何以任何方式帮
  • 更新到 macos mavericks 后 gem install autotest-fsevent 失败

    更新到 Maveriks 后安装 gem 时遇到问题autotest fsevent 这是我得到的错误 Mellon public lasdolphin sudo gem install autotest fsevent Building
  • 是否有跨平台方法可以将资源嵌入到用 C++ 编写的二进制应用程序中? [复制]

    这个问题在这里已经有答案了 我试图将一些资源 图像 音乐和数据文件 捆绑到我的二进制应用程序 用 C 编写 中 我希望将所有内容都包含在一个可执行文件中 这样我就可以发送 大 可执行文件并且它可以工作 不能删除任何资产 我看到 Visual
  • .animate 回调函数之后的 .done

    我想在 animate 回调函数之后调用一个函数 我正在使用 done 方法来实现此目的 但它不起作用 fiddle http jsfiddle net dWAP4 function button click function div an
  • 向特定用户授予文件访问权限[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 在Linux中 如何向特定人员授予文件 文件夹的访问权限 换句话说 假设我只想允许只有用户 fred 能够读取文件 那么我该怎么做呢 请注意 我了解
  • 密码验证C++

    嗨 这是我第一次使用课程 所以对我糟糕的解释表示歉意 基本上我正在为电梯程序制作密码功能 LogIn 是我的类的名称 其中包含字符串 john 它是密码 除了错误密码尝试的循环之外 一切似乎都工作正常 如果第一次密码尝试正确 则代码可以正常
  • 成员函数特征

    我正在编写一个模板类 它包装成员函数以减少一些调用 如果某些条件为真 则不需要调用成员函数 签名看起来像这样 template