3

我正在模板中使用指向成员类型的指针,目前我正在做这样的事情:

template <typename Base, typename Type, Type Base::* Var>
struct Member
{
    //Stuff goes here.
};

但是必须定义 Base、Type 和 Var,似乎有点多余,因为 Base 和 Type 隐含在 Var 的类型中。

有没有办法做到这一点,这样,当使用/调用成员结构时,它只需要使用单个指向成员参数的指针?就像,理论上,是这样的:

template <typename Base, typename Type, Type Base::* Var>
struct Member<Var>
{
    //stuff goes here
};

struct S
{
    int memberVal;
};

int main()
{
    Member<&S::memberVal> example;
};

谢谢您的帮助!

4

2 回答 2

1

没门。只有您的第一个变体是正确的。您正在举例说明 C++ cyntax 不是那么优雅。就这样吧。

您的第二个示例具有模板专业化的语法。虽然它是一个新模板的定义。这很可能会被当作反对意见。

于 2012-08-08T04:01:51.190 回答
1

您所要求的不能直接在 C++ 中实现。限制是对于非类型模板参数,必须在模板定义中提供类型。类型推导仅适用于函数参数。

根据您的实际用例,可以使用其他替代方法,但它们意味着将成员指针从模板参数(编译时)移动到函数参数(运行时)。也就是说,给定一个类型:

template <typename C, typename M>
struct Member {
   M C::*ptr;
   Member( M C::*ptr ) : ptr(ptr) {}
};

可以使用以下语法创建它的实例:

auto x = create_member( &S::memberVal );

通过使用一些元编程技巧,虽然不太复杂:

template <typename T> struct MemberType;
template <typename T, typename M> 
struct MemberType<M T::*> {
   typedef Member<T,M> type;
};
template <typename T>
typename MemberType<T>::type
create_member( T mbrptr ) {
    typename MemberType::type r(mbrptr);
    return r;
}

但正如我已经提到的,这意味着将编译时参数转换为运行时参数,因此可能会抑制编译器会做的一些优化(即内联)。

于 2012-08-08T05:02:52.223 回答