相同的模板结构,C++

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 Sourcetypename Dest是否来自相同的颜色模型,我需要正确转换。换句话说,如果一些typename T1 是混合类型名A<B>而另一个typename T2是混合类型名,A1<B1>我如何判断typename Atypename A1是否相同?如果A B A1 B1我的convert()函数中有所有类型名,我可以通过检查来判断,std::is_same<A<B>,A1<B>>::value但是如果我像这样声明我的函数模板,我最终将无法使用convert<RGB_888,ARGB_Float>(rgb888,argbFloat);这个签名(但我可以将它与 RGB 和 ARGB 一起使用)

请注意:我的程序中还有许多其他颜色模型,这些只是示例。

Jar*_*d42 5

看来你想要重载

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)