说我想写一些"代理";对象,例如添加在调用包装的可调用对象之前发生的一些功能。此外,假设我希望是常量正确的,这样只有当包装的可调用对象具有可访问的非常量operator()
时,代理才具有可访问性。然后我需要做这样的事情,定义两个版本的运算符并使用SFINAE:
template <typename F>
struct Proxy {
F wrapped;
template <typename = std::enable_if_t<std::is_invocable_v<F&>>>
auto operator()();
template <typename = std::enable_if_t<std::is_invocable_v<const F&>>>
auto operator()() const;
};
这已经够烦人的了,但如果我现在也想代理裁判资格,我需要过载,这真的太过分了。如果我也想代理volatile
资格,请上帝保佑我。
有没有捷径可以让这件事不那么可怕?我似乎还记得,至少有一个功能被提议添加到标准中。
我想到的拟议特征是P0847R7("推导this
"(,它被C++23接受。这里有一些有用的幻灯片。我没有编译器来检查这一点,但我相信我的四个运算符可以写成一个,如下所示:
template <typename F>
struct Proxy {
F wrapped;
template <typename Me>
requires std::invocable<std::like_t<Me, F>>
auto operator()(this Me&& me);
};
(此处的类型要求使用P0847R7假设的假设like_t
元函数。请参阅此问题。(