gpt4 book ai didi

c# - 使用 C# 泛型专门化一个值?

转载 作者:太空狗 更新时间:2023-10-30 01:24:56 24 4
gpt4 key购买 nike

我有一些实现基本 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com