2013-03-01 106 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

相关问题