获取成员指针的成员类型
Obtain type of member having pointer to member
我正在尝试编写一个模板类,该类将接受任何类型,作为参数,该类型具有某些公共成员,可以用作索引(类型INT,简短,无符号,无符号,ETC)。我希望我的模板类接受要使用的对象的类型,以及我的模板类应用作"键"字段的此类字段。
我写了下面的东西(只是一个示例,可以让您了解我要如何使用它),但它不起作用。问题在于,我试图使用一个指针作为成员的指针作为指定为"值"类型的字段的信息,如果我的模板类使用以获取键。我想使用velltype获取尖端字段的类型,但它行不通。
是否有一种方法可以获取Poiter指向会员的字段类型?我尝试了衰减功能,但没有成功。我不想拥有" int a ::*"我只想获得" int"。
#include <iostream>
#include <vector>
using namespace std;
template <class V, class M, M member>
struct MyClass
{
using key_type = decltype(member);
vector<key_type> v;
MyClass()
{
v.push_back(1);
// ERROR - error: no matching function for call to 'std::vector<int A::*, std::allocator<int A::*> >::push_back(int)'
}
};
struct A
{
int x;
int key;
};
int main()
{
MyClass<A, decltype(&A::key), &A::key> mc;
}
tl; dr :对模板参数的一些小更正:
template <class C, typename Mem, Mem C::*member>
struct MyClass {
using key_type = Mem;
vector<key_type> v;
MyClass()
{
v.push_back(1);
}
};
和实例化:
MyClass<A, decltype(A::key), &A::key> mc;
将做到这一点。
说明:
您希望第三个参数是指向您通过的第一个参数的类成员的指针。这需要指向成员语法
C::*
的指针。Mem
类型是" Pointee"的类型。要获得成员的类型,而不是"成员指针"的类型,您需要使用成员访问表达式或合格的ID提供
decltype
。因此,那里的变化。
您可以通过仅将指针传递给成员类型(就像最初一样),并使用元函数从中提取相关信息来将模板参数的量减少到2。
template<typename T>
struct point_to_mem;
// Meta-function to extract type information from a pointer to a member.
template<class C, typename T>
struct point_to_mem<T C::*> {
using member_type = T;
using class_type = C;
};
template <typename PointToMem, PointToMem member>
struct MyClass {
using key_type = typename point_to_mem<PointToMem>::member_type;
vector<key_type> v;
MyClass()
{
v.push_back(1);
}
};
// ...
MyClass<decltype(&A::key), &A::key> mc;
最后,使用C 17,您可以使它真正经济,并将模板参数减少到1:
template <auto member>
struct MyClass {
using key_type = typename point_to_mem<decltype(member)>::member_type;
// As before
};
// ...
int main()
{
MyClass<&A::key> mc;
}
相关文章:
- 根据模板类型选择类模板的成员类型?
- 函数模板签名中忽略的成员类型def 的访问说明符
- 在C++如何从数组中提取成员并返回成员类型的数组?
- C++从成员类型中扣除类型的功能模板?
- 无法初始化以 std::byte 作为成员类型的位字段
- 构造函数可以更改默认成员类型吗?
- 使用相同方法但不同成员类型构建类的最佳方法
- 允许通过指向方法的成员参数的指针来推断模板参数所指向的成员类型
- 使用 std::条件根据模板参数选择成员类型
- CRTP:如何推断要用作返回类型的成员类型?
- 对成员类型的成员方法使用 std::result_of<>
- C :可以从类及其受保护的成员类型继承可以继承吗?
- 如何在不指定不必要的模板参数的情况下使用模板类的成员类型
- 基类数据成员类型取决于派生类
- C 多态性:允许模棱两可的成员类型
- 使用使用成员类型别名的构造函数来推论类模板参数
- 获取与在模板参数中传递的函数成员类型相同的类
- 如果静态成员未初始化并且成员类型是类本身,该怎么办?
- boost::bind 无法绑定到纯虚拟基类中定义的非静态函数模板成员类型
- 将联合强制转换为其成员类型之一