相同的模板结构,C++
Same Template struct, C++
假设我有结构 RGB 和 ARGB。
template<typename T>
struct RGB {
T r,g,b;
};
template<typename T>
struct ARGB {
T a,r,g,b;
}
下面我来定义它们。
using RGB_888 = RGB<unsigned char>;
using RGB_Float = RGB<float>;
using ARGB_8888 = ARGB<unsigned char>;
using ARGB_Float = ARGB<float>;
有时我想从一种 rgb 转换为另一种,以及从 rgb 转换为 argb。所以我做了以下。
template<typename Source, typename Dest>
void convert(const Source& source, Dest& dest)
{
}
它将像这样工作。
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);
问题是我无法检测typename Source
和typename Dest
是否来自相同的颜色模型,我需要它才能正确转换。换句话说,如果一些 typename T1
是混合类型名称 A<B>
而另一个 typename T2
是混合类型名称 A1<B1>
我如何判断 typename A
和 typename A1
一样不一样?如果我的 convert()
函数中有所有 A B A1 B1
类型名称,我可以通过检查 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)
{
// ...
}
有使用
RGB_888 rgb888{123,22,311};
RGB_Float rgbFloat;
convert(rgb888, rgbFloat);
RGB_888 rgb888(123,22,132};
ARGB_Float argbFloat;
convert(rgb888, argbFloat);
但是输出参数很奇怪,我想你可以做
template <typename Dest, typename Source>
RGB<Dest> toRGB(const RGB<Source>& source)
{
// ...
}
template <typename Dest, typename Source>
ARGB<Dest> toARGB(const RGB<Source>& source)
{
// ...
}
随着使用
RGB_888 rgb888{123, 22, 311};
RGB_Float rgbFloat = toRGB<float>(rgb888);
RGB_888 rgb888(123, 22, 132};
ARGB_Float argbFloat = toARGB<float>(rgb888);
假设我有结构 RGB 和 ARGB。
template<typename T>
struct RGB {
T r,g,b;
};
template<typename T>
struct ARGB {
T a,r,g,b;
}
下面我来定义它们。
using RGB_888 = RGB<unsigned char>;
using RGB_Float = RGB<float>;
using ARGB_8888 = ARGB<unsigned char>;
using ARGB_Float = ARGB<float>;
有时我想从一种 rgb 转换为另一种,以及从 rgb 转换为 argb。所以我做了以下。
template<typename Source, typename Dest>
void convert(const Source& source, Dest& dest)
{
}
它将像这样工作。
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);
问题是我无法检测typename Source
和typename Dest
是否来自相同的颜色模型,我需要它才能正确转换。换句话说,如果一些 typename T1
是混合类型名称 A<B>
而另一个 typename T2
是混合类型名称 A1<B1>
我如何判断 typename A
和 typename A1
一样不一样?如果我的 convert()
函数中有所有 A B A1 B1
类型名称,我可以通过检查 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)
{
// ...
}
有使用
RGB_888 rgb888{123,22,311};
RGB_Float rgbFloat;
convert(rgb888, rgbFloat);
RGB_888 rgb888(123,22,132};
ARGB_Float argbFloat;
convert(rgb888, argbFloat);
但是输出参数很奇怪,我想你可以做
template <typename Dest, typename Source>
RGB<Dest> toRGB(const RGB<Source>& source)
{
// ...
}
template <typename Dest, typename Source>
ARGB<Dest> toARGB(const RGB<Source>& source)
{
// ...
}
随着使用
RGB_888 rgb888{123, 22, 311};
RGB_Float rgbFloat = toRGB<float>(rgb888);
RGB_888 rgb888(123, 22, 132};
ARGB_Float argbFloat = toARGB<float>(rgb888);