具有多个模板说明符的功能

时间:2018-08-17 11:18:28

标签: c++

我不理解下面定义的模板,有人可以帮我解码吗?

template <typename Impl>
template <typename datadec, typename T>
inline datadec<Impl>::codec(const T& value)
{
    return codec<datadec>(Master::char_data(value), Master::size(value));
}

1 个答案:

答案 0 :(得分:7)

首先,如果不清楚,则OP中给出的代码段不会编译。为了符合我所认为的意图,需要对其进行两个最小的修改:

template <typename Impl>
template <typename datadec, typename T>
inline auto ::datadec<Impl>::codec(const T& value)
{
    codec<datadec>(Master::char_data(value), Master::size(value));
}

要回答这个问题,让我们逐行浏览一下:

因此,datadec 类模板采用单个模板参数typename Impl。因此,第一行:

template <typename Impl>

接下来的两行:

template <typename datadec, typename T>
inline auto ::datadec<Impl>::codec(const T& value)

显示为该类模板codec() (所以它是member function template of a class template)的成员函数模板 datadec的定义强>。该函数模板本身带有两个模板参数:typename datadectypename T。请注意,此处的第一个模板参数与类模板本身的名称相同-datadec

请注意,在OP中,此函数声明中缺少返回值类型。

接下来,我们将看到成员函数定义中的内容:

{
    return codec<datadec>(Master::char_data(value), Master::size(value));
}

有一个对另一个codec()的调用,该调用显式地与模板参数一起使用,该模板参数获取从外部传递的datadec模板参数,并接受两个非模板参数:{{1} }和Master::char_data(value)

编辑:为了阐明此摘要中Master::size(value)名称的“双重角色”,似乎引起了人们的关注,成员函数模板的名称与类模板本身的名称相同(如上所述)。现在,在没有提供更多上下文的情况下(以OP附带的代码形式提供代码的形式),让我们从设计的角度想象一下,类模板datadec代表了一些数据解码器,并且该datadec返回一些与codec相关的数据。然后,这些模板化声明保持原样的一个可能例子是codec()需要知道它需要使用哪种类型的 data解码器作为其返回值,例如您可以将codec()的两个参数版本专门用于不同类型的codec()