推导指向成员的指针模板参数
Deducing pointer-to-member template arguments
考虑具有成员变量的类,如下所示:
struct A {
int a;
char b;
};
struct B {
double c;
bool d;
};
是否可以声明一个接受作为其模板的模板类参数 指向声明的任何一个成员的成员对象的指针在上面的课程中?接受泛型指向成员对象的指针的类可以是声明和使用方式如下:
template<typename Class, typename Type, Type (Class::*Member)>
struct Magic
{ };
// Usage:
typedef Magic<A, int, &A::a> MagicWithA_a;
不幸的是,必须通过Class
和 每次Type
模板参数以使最终指针正常工作。
有没有办法通过部分专业化来推断这些论点,例如?也就是说,如何声明Magic
类以使以下定义有效?
typedef Magic<&B::c> MagicWithB_c;
typedef Magic<&A::b> MagicWithA_b;
使用 C++17 可以使用auto
非类型模板参数:
template<auto p_member>
struct Magic
{ };
在 C++17 之前,只有您实现的较长变体才有效。
你可以通过专业化来缩短它,是的。如果你不介意诉诸宏,你几乎可以用 c++11 获得你想要的语法。首先,主要模板专用化:
template<typename T, T pm>
struct MagicImpl; // Undefined for most types
然后是指向成员的指针的部分特化,我们可以在其中自由添加我们希望推导的参数:
template<class Class, typename Type>
struct MagicImpl<Type Class::*, Type (Class::*Member)> {
};
最后,我们需要使用 decltype
从指向成员的指针表达式中获取指向成员类型的指针,我们将其隐藏在上述宏后面:
#define MAGIC(...) MagicImpl<decltype(__VA_ARGS__), __VA_ARGS__>
您可以按如下方式使用它:
typedef MAGIC(&B::c) MagicWithB_c;
typedef MAGIC(&A::b) MagicWithA_b;
相关文章:
- 为函数定义符号不明确的指针参数
- 构造函数 (C++) 中的 char 指针参数存在问题
- 按引用调用与按指针参数调用的差异 前递增和后递增
- 为什么具有指针参数的成员函数需要指向指针的指针?
- 通过引用函数传递指针参数是什么意思?
- 从double到double*的指针参数
- void 函数中的指针参数返回不一致的值
- 无法向上转换指针到指针参数
- 将数组动态分配到具有指针参数的函数中
- 模板函数指针参数与构造函数参数
- 使用通用函数指针参数化函数模板的简洁方法
- 如何为C++字符串分配空指针参数?
- C++带有指针参数的函数
- 指针参数的默认值
- 将常量添加到函数模板指针参数
- 如何传递unique_ptr<T>代替原始*输出*指针参数?
- 不带星号的函数指针参数
- 功能指针参数参数转换为const
- 将指针参数传递给双指针参数
- 如何调试指针参数是否通过函数修改