指针类成员作为模板参数(Pointer to class member as a template

2019-07-20 18:04发布

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

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

错误:太多的模板参数列表

我试图用一个辅助函数(即没有实际锵工作,但被拒绝GCC):

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

误差:使用参数`构件的”外功能体
错误:模板参数3无效

是否有可能有一个简单的MyStruct<&SomeClass::value> ,如果是这样,怎么样?

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

  • 指针类成员作为模板参数
  • 的C ++ 0x误差constexpr并返回模板函数

Answer 1:

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



Answer 2:

我的问题的答案是本文提出了下一个即将到来的C ++标准:

  • https://isocpp.org/files/papers/n3601.html

提出这个语法:

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

some_struct<&A::f> x;

需要有一个新的语法结构表明,你不能这样做,现在。

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



Answer 3:

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


Answer 4:

让你的结果类模板类的子类。 假设指针成员在公共你的结果类或任何的一个对象,你可以通过做这样的事情访问的任何对象

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


文章来源: Pointer to class member as a template parameter