我不理解下面定义的模板,有人可以帮我解码吗?
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));
}
答案 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 datadec
和typename 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()
。