簡體   English   中英

指向類成員的指針作為模板參數

[英]Pointer to class member as a template parameter

我想使用指向類成員的指針作為模板參數,如下所示:

template <class Class, class Result, Result Class::*Member>
struct MyStruct {
    // ...
};

使用像MyStruct<SomeClass, SomeResult, &SomeClass::value> variable這樣的結構可以很好地工作,但是我不喜歡我必須指定SomeClassSomeResult

如果可能的話,我想使用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中,通過在模板參數中添加autoP0127) ,我認為您現在可以執行以下操作:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM