具有多个模板说明符的函数

Function with multiple template specifiers

本文关键字:说明符 函数      更新时间:2023-10-16

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

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));
}

首先,如果不清楚,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)

构成此类模板datadec的成员函数模板codec()的定义(因此它是类模板的成员函数模板(。此函数模板本身采用两个模板参数:typename datadectypename T。请注意,此处的第一个模板参数与类模板本身同名 --datadec

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

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

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

有一个对不同codec()的调用,该与模板参数显式一起使用,该模板参数获取从外部传递的datadec模板参数并采用两个非模板参数:Master::char_data(value)Master::size(value)

编辑:为了阐明此片段中datadec名称的"双重角色"——因为它似乎引起了一些人的注意,这个论点(由成员函数模板采用(与类模板本身同名,如上所述:在没有 OP 提供更多上下文的情况下, 从设计的角度来看,假设类模板datadec表示一些数据解码器,并且codec()返回一些与编解码器相关的数据。然后,对这些模板化声明保持原样的一个合理解释是,codec()需要知道它需要为其返回值使用哪种类型的数据解码器- 例如,您可以将codec()的两个参数版本专门用于不同类型的datadec