2013-03-01 104 views
14

我想用一個指針指向一個類成員作爲模板參數爲:指針類成員作爲模板參數

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 { 
    // ... 
}; 

error: too many template-parameter-lists

我使用一個輔助函數(即沒有實際在Clang的工作,但是由GCC拒絕)嘗試:

template <class Class, class Result> 
static constexpr auto makeMyStruct(Result Class::*member) -> 
MyStruct<Class, Result, member> { 
    // ... 
} 

error: use of parameter `member' outside function body
error: template argument 3 is invalid

是否可以有一個簡單的MyStruct<&SomeClass::value>,如果是這樣,怎麼樣?

相關問題沒有解決不了我的問題:

+0

Dup? http://stackoverflow.com/questions/5628121/is-it-possible-to-emulate-templateauto-x – GManNickG 2013-03-01 01:38:19

+0

@GManNickG我不確定我的問題是否歸結爲其他問題。我的範圍更窄,使用宏我不會太高興。 – kay 2013-03-01 01:43:35

+1

術語是*指向成員的*,而不是*引用*給成員。引用和指針在語言上有很大不同(好吧,不是*不同,但仍不相同) – 2013-03-01 04:55:30

回答

2

這可能是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。

+0

不是第二個'_MyStruct <''不適合? – Quentin 2017-07-19 08:02:34

+0

@Quentin:是的,當然,謝謝! ;-) – ManuelAtWork 2017-07-19 08:11:46

-6

讓你的結果類模板類的子類。假設指針成員在公共你的結果類或任何的一個對象,你可以通過做這樣的事情

template <stuff for this class> :: public result 
{ 
    blah 
} 
11

我的問題的答案,本文提出了下一個即將到來的C++標準訪問任何對象:

提出這句法:

template<using typename T, T t> 
struct some_struct { /* ... */ }; 

some_struct<&A::f> x; 

需要一個新的語法結構表明你現在不能這樣做。

我希望n3601會被接受。:-)

5

在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(); 
+0

這似乎在鏗鏘聲5.0工作https://godbolt.org/g/jc3mSl – 2017-03-17 17:24:58

相關問題