具有多个模板说明符的函数
Function with multiple template specifiers
我不明白下面定义的模板,有人可以帮我解码吗?
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 datadec
和typename 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
。
相关文章:
- 为什么转换函数声明不需要至少一个定义类型说明符
- NOEXCEPT 函数调用运算符的说明符_Not_fn
- 函数模板签名中忽略的成员类型def 的访问说明符
- 具有多个模板说明符的函数
- 在回调中使用函数时,C++未知重写说明符
- 是否可以要求虚函数使用C++"覆盖"说明符?
- 警告:函数使用不带尾随返回类型的'auto'类型说明符
- 缩短成员函数作用域说明符(嵌套类)(C++)
- 创建模板函数的每个实例时,模板函数类型定义说明符是否会正确内联?
- gmock - 如何使用 noexcept 说明符模拟函数
- 什么是带有友元说明符的析构函数
- 使用最终类说明符时,最终函数说明符是否冗余?
- C++14 使用捕获说明符递增 lambda 函数内部的值
- 析构函数在 lambda 捕获说明符中声明的类实例上运行两次
- 是复制构造函数中初始值设定项列表中的make_unique不使用noexcept说明符的好用途
- C2694 在析构函数上,当基类成员的析构函数具有非空 noexcept 说明符和主体时
- 构造函数C++异常说明符
- 缺少关于虚函数实现的类型说明符
- C++ 'XY'之前的预期类型说明符 - 在成员函数中虚拟无效
- void 函数 C++ 错误 此声明没有存储类或类型说明符