出于某些原因,我必须在C++中实现多维数组类.有问题的数组是这样的:
template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>>
class Array final
{
private:
std::vector<size_t> shape_;
std::vector<T> data_;
public:
// Some public methods
}
Run Code Online (Sandbox Code Playgroud)
T 是存储在数组中的元素的类型,并且数组的维度不是模板化的,因为用户应该能够重塑数组,例如:
Array<int> array = Array<int>::zeros(3, 2, 4);
array.reshape(4, 6);
Run Code Online (Sandbox Code Playgroud)
虽然上面提到的函数的实现非常顺利,但我坚持实现这个类的"开始",即初始化数组......我的问题如下:
有没有像这样的构造函数的方法,这样不同深度的嵌套初始化程序列表创建不同的数组,如:
Array<int> a = {1, 2}; // Dimension: 1, Shape: 2
Array<int> b = {{1}, {2}}; // Dimension: 2, Shape: 2x1
Run Code Online (Sandbox Code Playgroud)
我实现构造函数的方法使这两个数组相同,这不是我想要的.此外,铿锵抱怨支撑的标量,这似乎是问题所在.目前我遇到上述问题的天真方法看起来像这样
...
Array() :data_(0), shape_{0} {}
Array(std::initializer_list<T> list) :data_(list), shape_{list.size()} {}
Array(std::initializer_list<Array> lists)
{
// Implementation
}
...
Run Code Online (Sandbox Code Playgroud)编译器很容易扣除以下数组的类型:
Array c = {1, 2}; // T …Run Code Online (Sandbox Code Playgroud)我正在学习 Vulkan,我刚刚使用原始 ImGui 存储库中的 Vulkan-GLFW 示例将 ImGui 集成到我的代码中,并且运行良好。
现在我想同时在屏幕上渲染 GUI 和我的 3D 模型,由于 GUI 和模型肯定需要不同的着色器,我需要使用多个管道并提交多个命令。GUI 是部分透明的,所以我希望它在模型之后呈现。Vulkan 规范指出命令的执行顺序不太可能是我记录命令的顺序,因此我需要某种同步。在这篇 Reddit 帖子中,提出了几种完全实现我的目标的方法,我曾经相信我必须使用多个子通道(连同子通道依赖)或障碍或其他类似的同步方法来解决这个问题。
然后我查看了SaschaWillems 的 Vulkan 示例,尽管在 ImGui 示例中,我看到两个绘制调用之间没有同步,它只是先记录绘制模型的命令,然后记录绘制 GUI 的命令。
我很迷惑。在这种情况下真的需要同步,还是我误解了命令重新排序或混合?谢谢。
我正在完成我的家庭作业,并陷入了一些泛型和继承问题.
我有一个通用的红黑树类,因为它是红黑树,它的键应该是可比的,所以
public class RedBlackTree<T> where T : IComparable<T>
Run Code Online (Sandbox Code Playgroud)
然后我想要另一个类,比方说,一个间隔树,它是红黑树的增强版本.所以我定义了这样的间隔:
public class Interval<T> : IComparable where T : IComparable<T>
Run Code Online (Sandbox Code Playgroud)
并且由于区间树确实是一个红色黑色的树,其间隔为其键,但只是使用更具体的方法,我定义了这样的类:
public class IntervalTree<T> : RedBlackTree<Interval<T>> where T : IComparable<T>
Run Code Online (Sandbox Code Playgroud)
但它不会让我这样做,它说"不能隐含地转换Interval<T>为System.IComparable<Interval<T>>",但我也写不出类似的东西where Interval<T> : IComparable<Interval<T>>.
我如何在C#中执行此类操作,或者如果在C#中无法执行此继承,我应该使用哪些其他模板?