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 的相关文章

随机推荐

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

    您好 我正在 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 否则返回