[英]Pointer to class member as a template parameter
我想使用指向類成員的指針作為模板參數,如下所示:
template <class Class, class Result, Result Class::*Member>
struct MyStruct {
// ...
};
使用像MyStruct<SomeClass, SomeResult, &SomeClass::value> variable
這樣的結構可以很好地工作,但是我不喜歡我必須指定SomeClass
和SomeResult
。
如果可能的話,我想使用MyStruct<&SomeClass::value> variable
,但又不會失去傳遞任何類和具有任何結果類型的能力。
我嘗試了以下操作,但是語法不合法:
template <class Class, class Result>
template <Result Class::*Member>
struct MyStruct {
// ...
};
錯誤:模板參數列表過多
我嘗試使用一個輔助函數(該函數實際上在Clang中有效,但被GCC拒絕了):
template <class Class, class Result>
static constexpr auto makeMyStruct(Result Class::*member) ->
MyStruct<Class, Result, member> {
// ...
}
錯誤:在函數體外部使用參數“ member”
錯誤:模板參數3無效
是否可以有一個簡單的MyStruct<&SomeClass::value>
,如果可以,怎么辦?
沒有解決我的問題的相關問題:
本文針對下一個即將發布的C ++標准提出了我的問題的答案:
提出了以下語法:
template<using typename T, T t>
struct some_struct { /* ... */ };
some_struct<&A::f> x;
對新語法結構的需求表明您現在無法做到這一點。
我希望n3601將被接受。 :-)
在c ++ 17中,通過在模板參數中添加auto
( P0127) ,我認為您現在可以執行以下操作:
template<auto value>
struct MyStruct {};
template<typename Class, typename Result, Result Class::* value>
struct MyStruct<value> {
// add members using Class, Result, and value here
using containing_type = Class;
};
typename MyStruct<&Something::theotherthing>::containing_type x = Something();
這可能是C ++ 11中的解決方案:
您可以定義以下通用類型特征:
template<class T>
struct remove_member_pointer {
typedef T type;
};
template<class Parent, class T>
struct remove_member_pointer<T Parent::*> {
typedef T type;
};
template<class T>
struct baseof_member_pointer {
typedef T type;
};
template<class Parent, class T>
struct baseof_member_pointer<T Parent::*> {
typedef Parent type;
};
現在,您可以為每個結構定義一個附加的4行包裝宏:
template<class Class, class Result, Result Class::*Member>
struct _MyStruct {
// ...
};
#define MyStruct(MemberPtr) \
_MyStruct<baseof_member_pointer<decltype(MemberPtr)>::type, \
remove_member_pointer<decltype(MemberPtr)>::type, \
MemberPtr>
...並以以下方式使用它:
MyStruct(&SomeClass::value) myStruct; // <-- object of type MyStruct<&SomeClass:value>
我將其用作中間解決方案,直到我們切換到C ++ 17。
使結果類成為模板類的子類。 假設指針成員是您的結果類的公共對象,則可以通過執行以下操作來訪問任何對象
template <stuff for this class> :: public result
{
blah
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.