小编Chl*_*rie的帖子

嵌套的initializer_list,用于初始化多维数组

出于某些原因,我必须在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)

虽然上面提到的函数的实现非常顺利,但我坚持实现这个类的"开始",即初始化数组......我的问题如下:

  1. 有没有像这样的构造函数的方法,这样不同深度的嵌套初始化程序列表创建不同的数组,如:

    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)
  2. 编译器很容易扣除以下数组的类型:

    Array c = {1, 2}; // T …
    Run Code Online (Sandbox Code Playgroud)

c++ arrays multidimensional-array initializer-list

5
推荐指数
1
解决办法
171
查看次数

在 Vulkan 中具有透明度的多个绘制调用之间是否需要同步?

我正在学习 Vulkan,我刚刚使用原始 ImGui 存储库中的 Vulkan-GLFW 示例将 ImGui 集成到我的代码中,并且运行良好。

现在我想同时在屏幕上渲染 GUI 和我的 3D 模型,由于 GUI 和模型肯定需要不同的着色器,我需要使用多个管道并提交多个命令。GUI 是部分透明的,所以我希望它在模型之后呈现。Vulkan 规范指出命令的执行顺序不太可能是我记录命令的顺序,因此我需要某种同步。在这篇 Reddit 帖子中,提出了几种完全实现我的目标的方法,我曾经相信我必须使用多个子通道(连同子通道依赖)或障碍或其他类似的同步方法来解决这个问题。

然后我查看了SaschaWillems 的 Vulkan 示例,尽管在 ImGui 示例中,我看到两个绘制调用之间没有同步,它只是先记录绘制模型的命令,然后记录绘制 GUI 的命令。

我很迷惑。在这种情况下真的需要同步,还是我误解了命令重新排序或混合?谢谢。

c++ synchronization rendering vulkan

4
推荐指数
1
解决办法
320
查看次数

如何从C#中的嵌套泛型类继承泛型类

我正在完成我的家庭作业,并陷入了一些泛型和继承问题.

我有一个通用的红黑树类,因为它是红黑树,它的键应该是可比的,所以

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#中无法执行此继承,我应该使用哪些其他模板?

c# generics inheritance nested-generics

1
推荐指数
1
解决办法
578
查看次数