SFINAE 并检测 C++ 函数对象是否返回 void

2023-11-26

我已经阅读了有关此问题的各种权威资料,包括Dewhurst但对于这个看似简单的问题却没有取得任何进展。

我想做的是call a C++ 函数对象,(基本上,任何你可以调用的东西,一个纯函数或一个带()的类),并返回它的值,如果它不是 void ,否则返回“true”。

using std:

struct Foo {
  void operator()() { cout << "Foo/"l; }
};
struct Bar {
  bool operator()() { cout << "Bar/"; return true; }
};

Foo foo;
Bar bar;
bool baz() { cout << "baz/"; return true; }
void bang() { cout << "bang/"; }

const char* print(bool b) { cout << b ? "true/" : "false/"; }

template <typename Functor> bool magicCallFunction(Functor f) {
  return true;  // Lots of template magic occurs here 
                // that results in the functor being called.
}

int main(int argc, char** argv) {
  print(magicCallFunction(foo));
  print(magicCallFunction(bar));
  print(magicCallFunction(baz));
  print(magicCallFunction(bang));
  printf("\n");
}
// Results:  Foo/true/Bar/true/baz/true/bang/true

UPDATE

感谢您的想法和想法!

基于此,我实际上决定将所有模板提升一级 - 所以我有:

bool eval(bool (*f)()) { return (*f)(); }

bool eval(void (*f)()) { (*f)(); return true; }

template <typename Type>
bool eval(Type* obj, bool (Type::*method)()) { return (obj->*method)(); }

template <typename Type>
bool eval(Type* obj, void (Type::*method)()) { (obj->*method)(); return true; }

和通用类来携带各种对象和方法。感谢 Mr.Ree 提供的代码将我推向了这个方向!


要在编译时检测 void 返回值,标准技巧是重载operator,。逗号运算符最酷的一点是它可以采用 void 参数,在这种情况下,它默认为内置参数operator,。在代码中:

template <typename> tag {};

template <typename T>
tag<T> operator,(T, tag<void>);

Now, expr, tag<void>()有类型tag<typeof(expr)>即使expr类型为 void。然后你可以用常用的技巧来捕捉这个问题:

char (&test(tag<void>))[1];
template <typename T> char (&test(tag<T>))[2];

template <typename F>
struct nullary_functor_traits
{
    static const bool returns_void = sizeof(test((factory()(), tag<void>()))) == 1;
private:
    static F factory();    
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SFINAE 并检测 C++ 函数对象是否返回 void 的相关文章

  • 将运算符 << 添加到 std::vector

    我想添加operator lt lt to std vector
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 从网页运行 ClickOnce 应用程序,无需用户操作

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

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多

随机推荐

  • 如何显示字节数组十六进制值?

    您好 我正在 c 中制作应用程序 我有包含十六进制值的字节数组 我想将这些值写入文件中 而不将其转换为字符串或其他任何内容 请帮助我 提前致谢 我来晚了一点 但没人提到比特转换器为你带来一点魔力的课程 public static strin
  • System.loadLibrary 不起作用。链中第二个库的 UnsatisfiedLinkError

    我有java程序Client class 它通过JNI使用cpp共享库libclient so libclient so 构建为共享并使用 cpp 共享库 libhttp so libclient so 和 libhttp so 放在文件夹
  • 如何从字符串中删除精确出现的字符?

    例如 我有一个像这样的字符串 string str santhosh phani ravi phani123 praveen sathish prakash 我想删除字符 phani from str 现在 我正在使用str str Rep
  • 在网页上嵌入 Powerpoint 查看器 (PHP)

    我正在构建一个 PHP 应用程序 用户可以在其中上传 Powerpoint 文件 我希望其他用户在线查看而不是下载 使用像google docs这样的第三方应用程序对于用户来说可能有点麻烦 是否可以用PHP编写powerpoint查看器代码
  • Itextsharp 为 IElement 设置字体

    var htmlarraylist HTMLWorker ParseToList new StringReader htmlText styles document Open BaseFont Vn Helvetica BaseFont C
  • 尝试访问数据帧列显示“<绑定方法 NDFrame.xxx...”

    我在 Jupyter 笔记本中创建 DataFrame 对象 data state Ohio Ohio Ohio Nevada Nevada year 2000 2001 2002 2000 2001 pop 1 5 2 0 3 6 2 4
  • 提取包含特定名称的列

    我正在尝试使用它来操作大型 txt 文件中的数据 我有一个包含 2000 多列的 txt 文件 其中大约三分之一的标题包含 Net 一词 我只想提取这些列并将它们写入新的 txt 文件 关于我如何做到这一点有什么建议吗 我四处搜寻了一下 但
  • umask() 什么时候有用?

    umask 0 fd open dev null O RDWR Here s man 2 umask umask sets the calling process s file mode creation mask umask to mas
  • CSS 媒体查询最小宽度无法正常工作

    我有一个像这样的 HTML
  • 为什么 numeric_limits::min() 不返回最小值?

    当我运行这段代码时 include
  • 覆盖 onReceivedSslError 不适用于 Android KitKat Web 视图

    当访问具有不可信证书的 https URL 时 我可以使用以下代码和低于 KitKat 版本的 WebView 绕过 SSL 错误 public void onReceivedSslError WebView view SslErrorHa
  • 加载程序集 Xamarin.Android.Support.v4 时出现异常

    我正在视觉工作室工作Xamarin Forms 我收到以下错误 加载程序集时出现异常 System IO FileNotFoundException 无法加载程序集 Xamarin Android Support v4 版本 1 0 0 0
  • 替换已弃用的函数 mysql_connect [重复]

    这个问题在这里已经有答案了 所以我已经设置好这个 Amazon Web Service 数据库 我正在为我计划使用它的应用程序编写一个旧教程 当我查找时 我注意到 mysql connect 已被弃用 我可以用什么作为替代方案 如何连接到我
  • 如何用Java画一个好看的圆

    我尝试过使用具有相同高度和宽度的drawOval方法 但随着直径的增加 圆形看起来变得更糟 无论大小如何 我该怎么做才能拥有一个看起来不错的圆圈 我将如何在java或其他方法中实现抗锯齿 事实证明 Java2D 我假设您正在使用它 已经非常
  • C++ 中“自然大小”的真正含义是什么?

    据我所知 自然大小 是特定硬件最有效处理的整数的宽度 使用时short在数组或算术运算中 short整数必须首先转换为int Q What exactly决定这个 自然尺寸 我不是在寻找简单的答案 例如 如果它具有 32 位架构 则其自然大
  • Tesseract 的自定义字典

    我目前正在开发一个使用 Tesseract OCR 的 Android 项目 我希望通过添加字典来微调提供给用户的结果 根据超正方 OCR 维基 解决这个问题的最好方法是 将 tessdata eng user words 替换为您自己的单
  • 为什么 Visual Studio 2010 不会因未处理的异常而中断?

    当我的程序中抛出异常并且未处理该异常时 我希望调试器能够中断我的程序并显示问题所在 这不会发生 相反 我的程序只是退出 并且调试停止 如果我查看调试输出 我可以看到我的异常 类型的第一次机会异常 系统 NullReferenceExcept
  • 在日历上设置最小和最大日期?

    我再次环顾四周 但找不到如何使用 VB 在 ASP net 中的日历上设置允许选择的最小和最大日期 我正在使用 Visual Studio 2010 目前它只是一个常规的日历控件 目前我看到过这样的事情 Calendar1 DateMin
  • 如何调试 PHP 应用程序?

    与我们可以使用 Visual Studio 调试 ASP NET 应用程序一样 哪种调试 PHP 应用程序的最佳方法是 我正在使用IDE日食光动力治疗 可以使用PHP扩展Xdebug提供调试功能 类似于 Visual Studio 可能功能
  • SFINAE 并检测 C++ 函数对象是否返回 void

    我已经阅读了有关此问题的各种权威资料 包括Dewhurst但对于这个看似简单的问题却没有取得任何进展 我想做的是call a C 函数对象 基本上 任何你可以调用的东西 一个纯函数或一个带 的类 并返回它的值 如果它不是 void 否则返回