【问题标题】:Determine Class Automatically When Passing Member Function Argument传递成员函数参数时自动确定类
【发布时间】:2022-01-20 02:54:53
【问题描述】:

我有以下 C++20 结构,使用如下所示:

struct Base {
   template <typename C>
   void wait_for(C& c, auto member) { (c.*member)(); }
};

struct Power : public Base {
   void wait_for(auto member) { Base::wait_for(*this, member); }
   bool isReady();
};

// called by
Power pow;
pow.wait_for(&Power::isReady);

这将在一个库中,因此我想简化调用以及在每个派生类中实现 wait_for 的需要。

一种简化方法是消除调用中的Power::。有没有办法确定wait_for的定义中的类类型?例如,调用:

pow.wait_for(&isReady);

既然这是Power 的成员,有没有办法隐含地知道这将是该类的成员?

[好吧,怀疑没有,但值得一问,因为 C++20 有很多角落和缝隙。]

【问题讨论】:

  • "一种简化方法是去掉调用中的Power::" 你能举出具体的例子吗?
  • 如果您指的是&amp;Power::isReady,这是创建指向成员的唯一方法。没有魔法可以从 &amp;isReady 推断出在哪里寻找它。

标签: c++ templates c++20


【解决方案1】:

没有,但是有办法以不同的方式封装调用,例如:

#include <concepts>
#include <functional>
#include <utility>

template<std::invocable F>
void wait_for(F&& f) { std::invoke(std::forward<F>(f)); }
//...
Power pow;
wait_for([&pow]{ pow.isReady(); });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    相关资源
    最近更新 更多