如何在C ++中显式调用抛出异常的方法?

深渊7:

我有一堂简单的课:

class A {
 public:
  bool f(int* status = nullptr) noexcept {
    if (status) *status = 1;
    return true;
  }
  void f() {
    throw std::make_pair<int, bool>(1, true);
  }
};

int main() {
  A a;
  a.f(); // <- Ambiguity is here! I want to call 'void f()'
}

我想通过任何方式解决方法调用的歧义,以支持抛出异常的方法。

此类接口的基本原理:

  • 要拥有noexcept(true)and noexcept(false)接口,
  • 为了允许通过noexcept(false)变体中的指针有选择地获取额外的信息-而noexcept(true)变体将始终将此信息打包在异常内。

有可能吗?也欢迎提供更好的界面的建议。

鲍洛夫:

如您所知,具有带有此类签名的功能显然是一个糟糕的设计。真正的解决方案是为其使用不同的名称,或者丢失默认参数,并已在其他答案中提出。

但是,如果您被接口所困,则不能更改,或者仅出于乐趣,这里可以显式调用void f()

技巧是使用函数指针强制转换来解决歧义:

a.f(); // <- ambiguity is here! I want to call 'void f()'

(a.*(static_cast<void (A::*)()>(&A::f)))(); // yep... that's the syntax... yeah...

好的,它可以工作,但是永远不要这样写代码!

有一些方法可以使其更具可读性。

使用指针:

// create a method pointer:
auto f_void = static_cast<void (A::*)()>(&A::f);

// the call is much much better, but still not as simple as `a.f()`
(a.*f_void)();

创建一个lambda或一个自由函数

auto f_void = [] (A& a)
{
    auto f_void = static_cast<void (A::*)()>(&A::f);
    (a.*f_void)();
};

// or

void f_void(A& a)
{
    auto f_void = static_cast<void (A::*)()>(&A::f);
    (a.*f_void)();
};


f_void(a);

我不知道这是否更好。调用语法肯定更简单,但是当我们从方法调用语法切换为自由函数调用语法时,它可能会造成混淆。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在C#中的基类上调用显式接口方法?

来自分类Dev

如何在 C++ 中不使用显式类型调用模板函数?

来自分类Dev

如何在C中显式打印特殊字符?

来自分类Dev

如何避免通过pythonnet在python中的IDisposable对象上显式调用Dispose方法?

来自分类Dev

是否需要在C#中显式引发异常?

来自分类Dev

如何在类抛出事件中调用方法?

来自分类Java

如何从动态代理显式调用默认方法?

来自分类Dev

Java:如何显式调用方法的自己的类版本?

来自分类Dev

C#:使用反射动态调用显式实现的方法

来自分类Dev

如何替换cypress中的显式等待调用?

来自分类Dev

C#中的显式构造函数调用

来自分类Dev

如何区分C ++中的隐式/显式构造函数调用?

来自分类Dev

如何在不指定类的情况下使用显式类型参数调用Java方法?

来自分类Java

Java:如何在try catch体内将异常抛出给方法调用者?

来自分类Dev

如何在Clojure中测试抛出的异常?

来自分类Dev

如何在异步函数中抛出异常?

来自分类Dev

如何在 Java 中抛出严重异常?

来自分类Dev

如何在Promise中抛出异常?

来自分类Dev

如何在没有显式路径的情况下启用bash中的程序调用?

来自分类Dev

如何在Java中显式调用静态初始化器?

来自分类Dev

如何在Rails 5.2中显式调用表单使用的动作?

来自分类Dev

C#如何在不使用值的情况下显式调用getter

来自分类Dev

从“全部捕获”块中抛出异常如何在C ++中生成相同的异常?

来自分类Dev

如何在Coq中显式提供隐式参数?

来自分类Dev

如何在C ++中的字符串中显式打印“ \ n”

来自分类Java

Java 8:如何使用流中的异常抛出方法?

来自分类Dev

如何声明Scala中抛出检查异常的Java方法的替代?

来自分类Java

在没有显式调用的情况下如何调用'actionPerformed'方法?

来自分类Dev

如何在布尔方法中抛出三个异常?

Related 相关文章

  1. 1

    如何在C#中的基类上调用显式接口方法?

  2. 2

    如何在 C++ 中不使用显式类型调用模板函数?

  3. 3

    如何在C中显式打印特殊字符?

  4. 4

    如何避免通过pythonnet在python中的IDisposable对象上显式调用Dispose方法?

  5. 5

    是否需要在C#中显式引发异常?

  6. 6

    如何在类抛出事件中调用方法?

  7. 7

    如何从动态代理显式调用默认方法?

  8. 8

    Java:如何显式调用方法的自己的类版本?

  9. 9

    C#:使用反射动态调用显式实现的方法

  10. 10

    如何替换cypress中的显式等待调用?

  11. 11

    C#中的显式构造函数调用

  12. 12

    如何区分C ++中的隐式/显式构造函数调用?

  13. 13

    如何在不指定类的情况下使用显式类型参数调用Java方法?

  14. 14

    Java:如何在try catch体内将异常抛出给方法调用者?

  15. 15

    如何在Clojure中测试抛出的异常?

  16. 16

    如何在异步函数中抛出异常?

  17. 17

    如何在 Java 中抛出严重异常?

  18. 18

    如何在Promise中抛出异常?

  19. 19

    如何在没有显式路径的情况下启用bash中的程序调用?

  20. 20

    如何在Java中显式调用静态初始化器?

  21. 21

    如何在Rails 5.2中显式调用表单使用的动作?

  22. 22

    C#如何在不使用值的情况下显式调用getter

  23. 23

    从“全部捕获”块中抛出异常如何在C ++中生成相同的异常?

  24. 24

    如何在Coq中显式提供隐式参数?

  25. 25

    如何在C ++中的字符串中显式打印“ \ n”

  26. 26

    Java 8:如何使用流中的异常抛出方法?

  27. 27

    如何声明Scala中抛出检查异常的Java方法的替代?

  28. 28

    在没有显式调用的情况下如何调用'actionPerformed'方法?

  29. 29

    如何在布尔方法中抛出三个异常?

热门标签

归档