类似指针的 类 和 ->* 运算符
Pointer-like classes and the ->* operator
我最近发现需要将指向成员的指针应用于迭代器指定的对象。我试过自然语法:
ite->*ptr = 42;
令我沮丧的是,它没有编译。迭代器不会重载 operator->*
,但更令人惊讶的是智能指针也不会。我需要求助于以下笨拙的方法:
(*ite).*ptr = 42;
实验(参见下面的实际示例)表明,对于自定义 classes,至少对于成员指针和成员函数指针来说,这样的语法似乎是可以实现的从 C++14 开始。
因此:
- 标准指针类 classes 不会超载
operator->*
是有原因的,还是只是疏忽?
- 在定义我自己的类似指针的 class 时,我是否应该重载
operator->*
,或者同样的原因是否适用于我?
Live example -- 什么编译,什么不编译,以及自定义 class.
的概念验证
这是你想要做的吗((&*ite)->*ptr) = 42;
?
您可以使用自由函数重载 ->*
。不一定是会员。
template <typename P,
typename T,
typename M>
M& operator->* (P smartptr, M T::*ptrmem)
{
return (*smartptr).*ptrmem;
}
现在所有定义了一元 operator*
的东西(迭代器、智能指针等)也可以使用 ->*
。您可能希望以更可控的方式进行,即分别为已知的迭代器、已知的智能指针等定义它。
由于显而易见的原因,这不适用于成员函数。对于这种情况,需要 specialize/overload 而 return 绑定 std::function
代替:
template <typename P,
typename T,
typename M,
typename ... Arg>
std::function<M(Arg&&...)>
operator->* (P smartptr, M (T::*ptrmem)(Arg... args))
{
return [smartptr,ptrmem](Arg&&... args) -> M
{ return ((*smartptr).*ptrmem)(std::forward<Arg>(args)...); };
}
我最近发现需要将指向成员的指针应用于迭代器指定的对象。我试过自然语法:
ite->*ptr = 42;
令我沮丧的是,它没有编译。迭代器不会重载 operator->*
,但更令人惊讶的是智能指针也不会。我需要求助于以下笨拙的方法:
(*ite).*ptr = 42;
实验(参见下面的实际示例)表明,对于自定义 classes,至少对于成员指针和成员函数指针来说,这样的语法似乎是可以实现的从 C++14 开始。
因此:
- 标准指针类 classes 不会超载
operator->*
是有原因的,还是只是疏忽? - 在定义我自己的类似指针的 class 时,我是否应该重载
operator->*
,或者同样的原因是否适用于我?
Live example -- 什么编译,什么不编译,以及自定义 class.
的概念验证这是你想要做的吗((&*ite)->*ptr) = 42;
?
您可以使用自由函数重载 ->*
。不一定是会员。
template <typename P,
typename T,
typename M>
M& operator->* (P smartptr, M T::*ptrmem)
{
return (*smartptr).*ptrmem;
}
现在所有定义了一元 operator*
的东西(迭代器、智能指针等)也可以使用 ->*
。您可能希望以更可控的方式进行,即分别为已知的迭代器、已知的智能指针等定义它。
由于显而易见的原因,这不适用于成员函数。对于这种情况,需要 specialize/overload 而 return 绑定 std::function
代替:
template <typename P,
typename T,
typename M,
typename ... Arg>
std::function<M(Arg&&...)>
operator->* (P smartptr, M (T::*ptrmem)(Arg... args))
{
return [smartptr,ptrmem](Arg&&... args) -> M
{ return ((*smartptr).*ptrmem)(std::forward<Arg>(args)...); };
}