【发布时间】:2015-06-12 14:59:06
【问题描述】:
考虑这种类型层次结构:
struct A {
int x;
};
struct B : A {
int y;
};
&B::y 的类型是int B::*,但&B::x 的类型是int A::*。它可以转换为int B::*,这是我需要的,但我需要显式执行该转换。
有没有一种方便的方法可以将类型推断为指向我指定的类的成员的指针?毕竟,如果我想要A::* 到x,我可以做到&A::x。
【问题讨论】:
-
一种“方便的方式”?上下文是什么?像
bikeshed<B>([](auto wrapper){ return &unwrap<decltype(wrapper)>::x; })这样的奇怪表达方便吗?编辑:哎呀,那是 C++14 -
@dyp 只是想避免写
template <typename Derived, typename CLS, typename T> T Derived::* to_derived(T CLS::*member)之类的东西,因为当B的名称很长时,to_derived<B>(&B::x)的输入有点烦人。只是希望我错过了一些聪明的方法。 -
你可以尝试推导非多态lambda的
operator()的参数类型,那么bikeshed([](tag<B> d){ return &unwrap<decltype(d)>::x })是可能的。如果只有一小部分成员名称,例如x,当然可以使用bikeshed<B>(x_name)来作为一些帮助对象x_name。 -
您仍然可以使用
#define member_ptr(C, m) to_derived<C>(&C::m)缩短它。 -
@Jarod42 是的,这就是我最终的结果。看起来像类型系统的一个奇怪方面不是吗?
标签: c++ c++11 pointer-to-member