Hra*_*yan -2 c++ templates std is-same
考虑我有结构 RGB 和 ARGB。
template<typename T>
struct RGB {
T r,g,b;
};
template<typename T>
struct ARGB {
T a,r,g,b;
}
Run Code Online (Sandbox Code Playgroud)
现在我通过以下来定义它们。
using RGB_888 = RGB<unsigned char>;
using RGB_Float = RGB<float>;
using ARGB_8888 = ARGB<unsigned char>;
using ARGB_Float = ARGB<float>;
Run Code Online (Sandbox Code Playgroud)
在某些时候,我想从一个 rgb 转换为另一个,从 rgb 转换为 argb。所以我做以下事情。
template<typename Source, typename Dest>
void convert(const Source& source, Dest& dest)
{
}
Run Code Online (Sandbox Code Playgroud)
它会像这样工作。
RGB_888 rgb888{123,22,311};
RGB_Float rgbFloat;
convert<RGB_888,RGB_Float>(rgb888,rgbFloat);
RGB_888 rgb888(123,22,132};
ARGB_Float argbFloat;
convert<RGB_888,ARGB_Float>(rgb888,argbFloat);
Run Code Online (Sandbox Code Playgroud)
问题是我无法检测typename Source和typename Dest是否来自相同的颜色模型,我需要正确转换。换句话说,如果一些typename T1 是混合类型名A<B>而另一个typename T2是混合类型名,A1<B1>我如何判断typename A和typename A1是否相同?如果A B A1 B1我的convert()函数中有所有类型名,我可以通过检查来判断,std::is_same<A<B>,A1<B>>::value但是如果我像这样声明我的函数模板,我最终将无法使用convert<RGB_888,ARGB_Float>(rgb888,argbFloat);这个签名(但我可以将它与 RGB 和 ARGB 一起使用)
请注意:我的程序中还有许多其他颜色模型,这些只是示例。
看来你想要重载
template<typename Source, typename Dest>
void convert(const RGB<Source>& source, RGB<Dest>& dest)
{
// ...
}
template<typename Source, typename Dest>
void convert(const RGB<Source>& source, ARGB<Dest>& dest)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
使用
RGB_888 rgb888{123,22,311};
RGB_Float rgbFloat;
convert(rgb888, rgbFloat);
RGB_888 rgb888(123,22,132};
ARGB_Float argbFloat;
convert(rgb888, argbFloat);
Run Code Online (Sandbox Code Playgroud)
但是输出参数很奇怪,我想你可以做到
template <typename Dest, typename Source>
RGB<Dest> toRGB(const RGB<Source>& source)
{
// ...
}
template <typename Dest, typename Source>
ARGB<Dest> toARGB(const RGB<Source>& source)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
随着使用
RGB_888 rgb888{123, 22, 311};
RGB_Float rgbFloat = toRGB<float>(rgb888);
RGB_888 rgb888(123, 22, 132};
ARGB_Float argbFloat = toARGB<float>(rgb888);
Run Code Online (Sandbox Code Playgroud)