Tay*_*lor 6 c++ shared-ptr variadic-templates
为什么std :: shared_ptr没有operator->*?
使用可变参数模板看起来很容易.
有关详细信息,请参阅此文章.
编辑:这似乎是一个潜在的重复:关于shared_ptr和指向成员运算符的指针` - >*`和`std :: bind`
这可以添加到std::shared_ptrC++14 之后,而不是您链接的复杂代码:
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)...);
};
}
Run Code Online (Sandbox Code Playgroud)
添加 SFINAE 可选。注意上面的完美前锋,这是不完美的。它还在一定程度上支持奇怪的“方法”类型,只要它们产生一些具有 且operator()没有其他重要的东西。
由于完美转发的不完善,这仍然是不完美的,因此这可能是放弃它并强制执行的原因.get()->*。使用 lambda 而不是类也存在一些小缺陷,但这些缺陷是可以修复的。
克隆界面的解决方案也有缺陷(它们可以移动两次而不是一次,或者意味着指数级的重载)。
->*有趣的是,我们可以在不修改的情况下注入上面的内容std:
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)...);
};
}
}
Run Code Online (Sandbox Code Playgroud)
然后using notstd::operator->*将其考虑在内。有趣的是,与它的许多亲戚(如和)->*不同,它不需要是类的非静态成员。->[]
我为 包含了一个类似的unique_ptr,因为为什么不呢。
另一种选择是将 存储shared_ptr在返回的 lambda 中:它增加了看起来像是低级操作的开销,所以我没有这样做,unique_ptr如果有趣的话,这样做是不明智的。
现在,以上所有内容都很好,但没有回答问题。
C++03 共享 ptr(例如 boost 共享 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);
}
Run Code Online (Sandbox Code Playgroud)
...使用宏(如boost)或样板代码复制进行模拟。这并不完美(每个参数的两个副本而不是一个?我想我们可以T用 args替换T const&args 来解决这个问题),但这会很困难。
相比之下,在 C++11 中这很容易。但是 std Shared ptr 是与 C++11 一起设计的,并且它的前身是在它之前设计的。因此,对于前辈来说,添加->*会带来很多痛苦和样板,但回报却很少,而 C++11 共享 ptr 就是基于这些编写的。
然而,这部分只是一个观点或一个故事。
| 归档时间: |
|
| 查看次数: |
391 次 |
| 最近记录: |