2012-02-14 100 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