繁体   English   中英

带有 const ref 参数的函数模板特化

[英]Function template specialization with const ref arguments

下面的代码编译得很好

#include <iostream>

struct rgb8{
    uint8_t r() const {return 0;};
};


template<typename L, typename P>
L pixelToLevel(P p) {
    return static_cast<L>(p);
}

template<>
uint8_t pixelToLevel<uint8_t, rgb8>(rgb8 p) {  //       <---------- line X
    return pixelToLevel<uint8_t, uint8_t>(p.r());
}


int main()
{
  pixelToLevel<uint8_t>(rgb8());
  return 0;
}

但是如果在第 XI 行rgb8 p更改为const rgb8& p ,它将无法编译。

(生成的确切编译器错误取决于显式模板参数rgb8是否也更改为const rgb8& 。)

如果我想通过引用而不是 X 行上的值传递p ,我该如何编译它?

您需要更改特化声明中的模板参数,调用它时也需要更改模板参数。 否则将调用主模板。 例如

template<>
uint8_t pixelToLevel<uint8_t, const rgb8&>(const rgb8& p) {  //       <---------- line X
    return pixelToLevel<uint8_t, uint8_t>(p.r());
}

然后

pixelToLevel<uint8_t, const rgb8&>(rgb8());

居住


编辑

鉴于pixelToLevel<uint8_t>(rgb8()); , 模板rgb8推导使用主模板进行, P推导为rgb8 (它不会推导出为const rgb8&与当前主模板的参数声明),那么特化版本将不会被调用。

您可以应用重载而不是模板特化。 例如

template<typename L, typename P>
L pixelToLevel(P p) {
    return static_cast<L>(p);
}

template<typename L>
L pixelToLevel(const rgb8& p) {  //       <---------- line X
    return pixelToLevel<L, uint8_t>(p.r());
}

然后pixelToLevel<uint8_t>(rgb8()); 将选择第二个过载。

居住

@songyuanyao 的另一种解决方案是

template<typename L, typename P>
L pixelToLevel(const P& p) {
    return static_cast<L>(p);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM