C++ 获取具有指向成员的指针的成员类型

C++ 获取具有指向成员的指针的成员类型,c++,C++,我正在尝试编写一个模板类,该类将接受任何类型作为参数,其中有一些公共成员可以用作索引(int、short、unsigned等类型)。我希望我的模板类接受要使用的对象的类型以及模板类应该使用这种类型的哪个字段作为“键”字段的信息 我写了下面这样的东西(只是一个例子,让你知道我想如何使用它),但它不起作用。问题是,我试图使用一个指向成员的指针作为模板类应该使用哪个类型的字段(指定为Value)来获取键的信息。我想使用decltype来获取指向字段的类型,但它不起作用 是否有方法获取poiter指向成

我正在尝试编写一个模板类,该类将接受任何类型作为参数,其中有一些公共成员可以用作索引(int、short、unsigned等类型)。我希望我的模板类接受要使用的对象的类型以及模板类应该使用这种类型的哪个字段作为“键”字段的信息

我写了下面这样的东西(只是一个例子,让你知道我想如何使用它),但它不起作用。问题是,我试图使用一个指向成员的指针作为模板类应该使用哪个类型的字段(指定为Value)来获取键的信息。我想使用decltype来获取指向字段的类型,但它不起作用

是否有方法获取poiter指向成员的字段类型?我试过衰减函数,但没有成功。我只想得到“int”,而不是“int A::*”

#包括
#包括
使用名称空间std;
模板
结构MyClass
{
使用key_type=decltype(成员);
向量v;
MyClass()
{
v、 推回(1);
//错误-错误:调用“std::vector::push_back(int)”时没有匹配函数
}
};
结构A
{ 
int x;
int键;
};
int main()
{
MyClass 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);
    }
};

最后,使用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;
}
模板
结构MyClass{
使用key\u type=typename point\u to\u mem::member\u type;
//一如既往
};
// ...
int main()
{
MyClass mc;
}

注意以下操作成功:
静态断言(std::is\u same\u v):)谢谢!这解决了我的问题。还有一个问题:“class”和“typename”关键字有什么区别吗?@YotKay-它们对模板类型参数的含义相同。我只是更喜欢用一个来记录我期望的实际类类型,当期望任何类型时用另一个。哇,短版本要好得多。但是为什么需要C++17呢?C++11中还缺少什么可以做到这一点?@YotKay-传递非类型模板参数(例如指向成员的指针)的能力,其中包含要推导的占位符类型(例如
auto
)。这叫什么?
MyClass<A, decltype(A::key), &A::key> mc;
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;
template <auto member>
struct MyClass {
    using key_type = typename point_to_mem<decltype(member)>::member_type;
    // As before
};

// ...

int main()
{
    MyClass<&A::key> mc;
}