- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一些实现基本 Pixel
类的 C++ 代码。这只是我所拥有的重要部分的一部分:
// Pixel.h
template <class SizeType>
struct Pixel
{
public:
typedef SizeType Size;
Size R;
Size G;
Size B;
static Size Min;
static Size Max;
TPixel(Size R = Min, Size G = Min, Size B = Min);
};
#include "Pixel.impl"
// Pixel.impl
template <class SizeType> SizeType Pixel<SizeType>::Min = std::numeric_limits<Size>::min();
template <class SizeType> SizeType Pixel<SizeType>::Max = std::numeric_limits<Size>::max();
template <> float Pixel<float>::Min = 0;
template <> float Pixel<float>::Max = 1;
template <> double Pixel<double>::Min = 0;
template <> double Pixel<double>::Max = 1;
在 C# 中我试图复制这个:
struct Pixel<Size> where Size : struct
{
public Size R;
public Size G;
public Size B;
public static const Size Min; // What should I do here?
public static const Size Max;
}
除了我不知道如何将这个最小/最大尺寸包含到类型中。我希望能够有一个统一的 Pixel 界面,它允许您执行诸如夹紧、添加、缩放等操作。
当我尝试处理可能为任意类型的向量和矩阵时,我遇到了类似的解决方案。谁能告诉我如何完成上述 C++ 代码的工作?
最佳答案
与 C++ 模板特化不同,.Net 中不存在泛型特化之类的东西。
你不能初始化 T
除了 T
之外的任何实例,除非您有约束,否则您不能使用静态构造函数来尝试解决该问题。
据我所知,没有任何约束允许您仅指定数值类型或从数值类型转换而来的类型。
我建议你只制作两种不同类型的类:
public struct PixelFloat
{
public float R { get; set; }
public float G { get; set; }
public float B { get; set; }
public const float Min = 0.0f;
public const float Max = 1.0f;
}
public struct PixelDouble
{
public double R { get; set; }
public double G { get; set; }
public double B { get; set; }
public const double Min = 0.0f;
public const double Max = 1.0f;
}
无论如何,这实际上是同一件事,因为这就是它在幕后编译的结果。与此相比,其他解决方案不会给您带来太多好处,因为您仍然需要输入以下类型:Pixel<double>
Pixel<float>
.
此外,在这种情况下,我建议您使用的名称表明您正在使用通用参数中的类型。 Size
显然不是通用参数。 TSize
是。和 TSize
没有描述类型的作用,它只是描述了它是如何变化的。相反,您应该将其命名为 TValue
.
关于c# - 使用 C# 泛型专门化一个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8059311/
我有一个带有模板函数的基类,该函数具有通用模板类型和专用版本。 #ifndef BASE_CLASS #define BASE_CLASS #include using namespace std;
我有这个 3D vector 模板 template class Vec3TYPE{ public: union{ struct{ TYPE x,y,z; }; struct{ TY
我是一名优秀的程序员,十分优秀!