gpt4 book ai didi

c++ - 为什么 std::shared_ptr 没有 operator->*?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:30:55 24 4
gpt4 key购买 nike

为什么 std::shared_ptr 没有 operator->*

使用可变模板似乎很容易实现。

参见 this paper了解更多信息。

编辑:这似乎是以下内容的潜在重复:About shared_ptr and pointer to member operator `->*` and `std::bind`

最佳答案

这可以在 C++14 之后添加到 std::shared_ptr 而不是您链接的复杂代码:

template<class Method>
auto operator->*(Method&& method){
return [t=get(),m=std::forward<Method>(method)](auto&&args){
return (t->*m)(std::forward<decltype(args)>(args)...);
};
}

添加 SFINAE 可选。注意上面的完美前锋,这是不完美的。它还在一定程度上支持奇怪的“方法”类型,只要它们产生带有 operator() 的东西并且没有其他重要的东西。

由于完美转发的不完美,这仍然是不完美的,所以这可能是不理会它并强制使用 .get()->* 的原因。使用 lambda 而不是类也有一些小缺陷,但这些可以修复。

克隆接口(interface)的解决方案也有缺陷(它们可以移动两次而不是一次,或者意味着过载的指数数量)。

有趣的是,我们可以在不修改 std 的情况下注入(inject)上面的 ->*:

namespace notstd{
template<class...Ts, class Method>
auto operator->*(std::shared_ptr<Ts...> const& p, Method&& method){
return [t=p.get(),m=std::forward<Method>(method)](auto&&args){
return (t->*m)(std::forward<decltype(args)>(args)...);
};
}
template<class...Ts, class Method>
auto operator->*(std::unique_ptr<Ts...> const& p, Method&& method){
return [t=p.get(),m=std::forward<Method>(method)](auto&&args){
return (t->*m)(std::forward<decltype(args)>(args)...);
};
}
}

然后 使用 notstd::operator->* 将其考虑在内。有趣的是,->* 不需要是一个类的非静态成员就可以使用它,不像它的许多亲戚(如 ->[] )。

我为 unique_ptr 添加了一个类似的,因为为什么不呢。

另一种选择是将 shared_ptr 存储在返回的 lambda 中:它增加了看起来像低级操作的开销,所以我没有这样做,并且在 unique_ptr 如果有趣的话,那将是不明智的。

现在以上都很好,但没有回答问题。

C++03 shared ptr(比如,boost shared ptr)可以添加:

template<class T, class R, class...Args>
struct mem_fun_invoke; // details, exposes `R operator()(Args...)const`
template<class T, class D, class R, class...Args>
mem_fun_invoke<T,R,Args...>
operator->*(std::shared_ptr<Ts...> const& p, R(T::*Method)(Args...)){
return mem_fun_invoke<T,R,Args...>(p.get(), Method);
}

with ... 使用宏模拟(如在 boost 中)或样板代码复制。这不是完美的(每个 arg 的两个拷贝而不是一个?我想我们可以用 T const& args 替换 T args 来解决这个问题),但它会努力。

相比之下,在 C++11 中很容易。但是 std shared ptr 是与 C++11 一起设计的,它的前身是在它之前设计的。因此,对于先行者来说,添加 ->* 会带来很多痛苦和样板代码,但收效甚微,而 C++11 shared ptr 就是基于这些编写的。

然而,这部分只是一个意见或一个普通的故事。

关于c++ - 为什么 std::shared_ptr 没有 operator->*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28013423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com