我想使用指向类成员的指针作为模板参数,如:
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&#39;外部功能体
错误:模板参数3无效
是否可以使用简单MyStruct<&SomeClass::value>
,如果有,可以如何?
相关问题没有解决我的问题:
答案 0 :(得分:11)
本文针对下一个即将推出的C ++标准提出了我的问题的答案:
提出了这种语法:
template<using typename T, T t>
struct some_struct { /* ... */ };
some_struct<&A::f> x;
需要新的语法结构表明你现在不能这样做。
我希望n3601会被接受。 : - )
答案 1 :(得分:8)
在c ++ 17中,在模板参数(P0127)中添加了func willDismissSearchController(_ searchController: UISearchController) {
DispatchQueue.main.async {
searchController.transitionCoordinator?.animate(alongsideTransition: { (context) in
// animate views
}, completion: nil)
}
}
,我认为你现在可以做到:
auto
答案 2 :(得分:5)
这可能是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。
答案 3 :(得分:-6)
使您的结果类成为模板类的子级。假设指针成员是公共或任何结果类的对象,您可以通过执行类似的操作来访问任何对象
template <stuff for this class> :: public result
{
blah
}