从指针到成员的类模板推导

class template deduction from pointer to member

本文关键字:指针 成员      更新时间:2023-10-16

作为类模板参数之一,我需要使用指向成员的指针:

template <class Base, typename Member, Member Base::*m>
class MemPtrTestUgly
{
...
};

这需要用作

struct S
{
    int t;
}
MembPtrTestUgly <S, int, &S::t> m;

但我想这样使用它:

MemPtrTestNice<S, &S::t> m;

成员类型是从成员指针推导出来的。我不能使用函数模板,因为MemPtrTest类不应该被实例化(只会使用一些静态函数)。有没有一种方法可以在纯C++03(没有Boost或TR1)中做到这一点?

您可以使用部分专业化并获得一个非常漂亮的实现:

template <typename TMember, TMember MemberPtr>
class MemPtrTest;
template <typename TBase, typename TType, TType TBase::*MemberPtr>
class MemPtrTest<TType TBase::*, MemberPtr>
{
    // ...
};

这将被用作:

MemPtrTest<decltype(&S::t), &S::t> m;

当然,如果您不想隐式指定成员类型,这需要decltype或等效的。