我想用一个指针指向一个类成员作为模板参数,如:
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 {
// ...
};
错误:太多的模板参数列表
我试图用一个辅助函数(即没有实际锵工作,但被拒绝GCC):
template <class Class, class Result>
static constexpr auto makeMyStruct(Result Class::*member) ->
MyStruct<Class, Result, member> {
// ...
}
误差:使用参数`构件的”外功能体
错误:模板参数3无效
是否有可能有一个简单的MyStruct<&SomeClass::value>
,如果是这样,怎么样?
相关没有解决不了我的问题的问题:
- 指针类成员作为模板参数
- 的C ++ 0x误差constexpr并返回模板函数
这可能是在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。
我的问题的答案是本文提出了下一个即将到来的C ++标准:
- https://isocpp.org/files/papers/n3601.html
提出这个语法:
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();
让你的结果类模板类的子类。 假设指针成员在公共你的结果类或任何的一个对象,你可以通过做这样的事情访问的任何对象
template <stuff for this class> :: public result
{
blah
}