如何在C++中实现不重复的代理const/ref/volatile限定



说我想写一些"代理";对象,例如添加在调用包装的可调用对象之前发生的一些功能。此外,假设我希望是常量正确的,这样只有当包装的可调用对象具有可访问的非常量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元函数。请参阅此问题。(

最新更新