相同的模板结构,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 Sourcetypename Dest是否来自相同的颜色模型,我需要它才能正确转换。换句话说,如果一些 typename T1 是混合类型名称 A<B> 而另一个 typename T2 是混合类型名称 A1<B1> 我如何判断 typename Atypename 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);