25

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

template <class Class, class Result, Result Class::*Member>
struct MyStruct {
    // ...
};

使用这个结构就好MyStruct<SomeClass, SomeResult, &SomeClass::value> variable了,但我不喜欢我必须指定SomeClassand 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> {
    // ...
}

错误:在函数体外部使用参数“成员”
错误:模板参数 3 无效

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

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

4

4 回答 4

14

在 c++17 中,添加了autoin 模板参数 ( 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();
于 2017-01-04T23:43:54.157 回答
11

本文针对下一个即将推出的 C++ 标准提出了我的问题的答案:

提出了这种语法:

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

some_struct<&A::f> x;

对新句法结构的需求表明您现在无法做到这一点。

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

于 2013-03-19T20:05:11.307 回答
7

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

于 2017-07-19T07:47:04.547 回答
-6

使您的结果类成为您的模板类的子类。假设指针成员是公共结果类的对象或其他任何对象,您可以通过执行类似这样的操作来访问任何对象

template <stuff for this class> :: public result
{
    blah
}
于 2013-03-03T05:24:52.357 回答