首页 > 解决方案 > 可推导的非类型参数

问题描述

我正在浏览 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

用于推断正确类型的CM的规则是什么?

标签: c++templatesnon-type

解决方案


推荐阅读