指向类成员的指针作为模板参数

时间:2013-03-01 01:13:02

标签: c++ templates c++11 c++14 pointer-to-member

我想使用指向类成员的指针作为模板参数,如:

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&#39;外部功能体
  错误:模板参数3无效

是否可以使用简单MyStruct<&SomeClass::value>,如果有,可以如何?

相关问题没有解决我的问题:

4 个答案:

答案 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
}