c++ - 可推导的非类型参数
问题描述
我正在浏览 C++ 模板,完整指南,第 2 版,并且我正在研究非类型参数以及在推导过程中应用哪些规则
。上述书中的以下代码片段。
#include <iostream>
using namespace std;
template<typename> struct PMClassT;
template<typename C, typename M>
struct PMClassT<M C::*>
{
using Type = C;
};
template <typename PM>
using PMClass = typename PMClassT<PM>::Type;
template<auto PMD>
struct CounterHandle
{
PMClass<decltype(PMD)>& c;
CounterHandle(PMClass<decltype(PMD)> &c):c(c)
{
}
void incr()
{
++(c.*PMD);
}
};
struct S
{
int i;
};
int main()
{
S s{ 41 };
CounterHandle<&S::i>h(s);
h.incr();
return 0;
}
我很难理解上面的代码如何将模板 C 类型推断为真实类型 int
据我了解,根据实例化模型,模板< auto PMD > 被推导出为int S::i。这是正确的吗?
在下一行中,decltype(PMD) 是否返回一个整数作为结果?
那么如何使用下面的部分模板特化定义模板 struct PMClassT正确推导出 PMClass
用于推断正确类型的C和M的规则是什么?
解决方案
推荐阅读
- logging - 使用 Sidecar 模式进行 Kubernetes 日志收集
- lambda - NestJS + Lambda + Express 无法使其适用于 graphql 订阅
- arrays - 只有两个可能值的 Swift 数组
- flutter - 从 PopUntil 刷新 listView
- python - python矩阵乘法广播错误
- android - Android 使用 MaterialDatePicker 和 TextInputLayout
- firebase - 您如何将 Firebase 云功能部署到所有别名?
- angular - 从实现类的构造函数中获取接口方法的实现
- julia - 如何运行 Julia 项目?
- scala - AES加密/解密scala