2012-02-14 102 views
2

,因为我需要用一个指针成员的类模板参数之一:类模板扣除成员

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(没有升压或TR1)?

+0

我怀疑,如果可以用C++ 03。 – iammilind 2012-02-14 10:59:23

回答

1

您可以使用局部特殊化,并得到一个非常好看的实现:

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或等效的,如果你不想隐式指定成员类型。

+0

'decltype'在C++ 11中。另一个选项'typeof'只适用于gcc。还有其他选择吗? – 2012-02-14 11:10:06

+0

为了将值作为模板参数,您需要能够在模板参数列表中构建该值的类型。最可能的解决方法是C++可以从常规值推断出一种类型的上下文,这基本上归结为您自己实现'decltype'。 – 2012-02-14 11:16:00

+0

您可以使用模板参数推导在辅助函数内部生成此类的实例,但如果您想命名类本身,则不会对您有所帮助。 – 2012-02-14 11:24:06