小编Alp*_*der的帖子

有人可以帮我理解VkPhysicalDeviceMemoryProperties吗?

我想弄清楚,但我有点陷入困境.

类型和堆相关的方式很简单,如果有点奇怪.(为什么不给VkMemoryHeap一个VkMemoryType会员?)

我想我明白了所有的VkMemoryPropertyFlags意思,它们看起来相当简单.

但是VkMemoryHeap.flags会员呢?它显然只有一个非零有效值,VkMemoryHeapFlagBits.VK_MEMORY_HEAP_DEVICE_LOCAL_BIT虽然它本身不会太奇怪,但也有一个VkMemoryPropertyFlagBits.VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT可能出现在堆的内存类型上.

VkMemoryHeap.flags会员意味着什么以及它与VkMemoryType.flags会员有什么关系?

memory-management vulkan

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

我怎样才能让 impl Trait 使用适当的生命周期来对具有另一个生命周期的值进行可变引用?

我有一个终生的结构:

struct HasLifetime<'a>( /* ... */ );
Run Code Online (Sandbox Code Playgroud)

有一个 trait 的实现Foo

impl<'a, 'b: 'a> Foo for &'a mut HasLifetime<'b> { }
Run Code Online (Sandbox Code Playgroud)

我想实现以下功能:

fn bar_to_foo<'a, 'b: 'a>(bar: &'a mut Lifetime<'b>) -> impl Foo {
    bar
}
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为返回impl的仅对'a. 但是,指定impl Foo + 'a导致:

struct HasLifetime<'a>( /* ... */ );
Run Code Online (Sandbox Code Playgroud)

带有装箱 trait 对象的看似等效的函数编译:

fn bar_to_foo<'a, 'b: 'a>(bar: &'a mut Lifetime<'b>) -> Box<Foo + 'a> {
    Box::new(bar)
}
Run Code Online (Sandbox Code Playgroud)

我如何定义bar_to_fooimpl Trait

游乐场链接

lifetime rust

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

为什么默认方法参数必须是C#中的编译时常量

编辑1:我知道有一些替代品,如伸缩式,这是一个纯粹的教育问题.

我知道这是真的,但为什么一定是这样呢?看起来像是这样的:

public class Foo{

    private int bar;

    public void SetBar(int baz = ThatOtherClass.GetBaz(3)){
        this.bar = baz;
    }

}
Run Code Online (Sandbox Code Playgroud)

编译器可以将方法更改为:

public void SetBar(int baz){

//if baz wasn't passed:
baz = ThatOtherClass.GetBaz(3);

this.bar = baz;

}
Run Code Online (Sandbox Code Playgroud)

为什么那不起作用,或者不行,这只是一个设计决定?

c# default compile-time-constant

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

是否有更新的AvalonDock替代品?

我需要一个像AvalonDock这样的对接系统用于一个项目,但它似乎最后一次更新于2013年6月.是否有更多...积极开发我可以使用它?

wpf docking

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

这个 Rust 宏有什么问题?

我正在尝试编写一个宏,From通过将类型包装在某个变体中来为枚举生成一个impl。

我想出了这个:

macro_rules! variant_derive_from {
    ($enum:ty:$variant:ident($from:ty)) => {
        impl From<$from> for $enum {
            fn from(thing: $from) -> $enum { return $enum::$variant(thing) }
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

但是,每当我尝试实际使用此宏时,都会出现以下错误:

error: expected expression, found `B`
|             fn from(thing: $from) -> $enum { $enum::$variant(thing) }
|                                               ^^^^
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么会发生这种情况,所以我运行了一个带有宏跟踪的构建,并且宏显然扩展到以下内容(当然是虚拟类型):

impl From < A > for B { fn from ( thing : A ) -> B { B :: AVariant ( thing ) } }
Run Code Online (Sandbox Code Playgroud)

将其直接粘贴到代码中时,它编译成功。是什么赋予了??

这是错误的完整示例。

macros rust

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

使用更多方法加载类会花费更多内存吗?

从本质上讲,Foo实例在获取其值时会使用更多内存,如下所示:

public class Foo
{

    internal double bar;

    double GetBar(){ return bar; }

}
Run Code Online (Sandbox Code Playgroud)

或者像这样?

public class Foo
{

    internal double bar;

}  

public static class FooManager
{
    public static double GetBar(Foo foo) { return foo.bar; }
}
Run Code Online (Sandbox Code Playgroud)

也就是说,每个方法每个对象或每个类型使用的内存是多少?

c#

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

有什么办法可以让扩展方法优先于通用方法吗?

在 .NET 中,如果有一个具有方法Foo<T>(T t)(无约束)和方法 Foo(string s) 的类,则调用会Foo("test")调用Foo接受string. 这一切都很好,除非string重载是一个扩展方法,在这种情况下总是调用泛型版本。是否有解决此问题的方法,还是我不走运?

c# generics overload-resolution

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

如何对实现特征的类型的迭代器的内容进行装箱?

我正在采用某种类型的迭代器,该迭代器必须实现 Trait A,并尝试将其转换为该 Trait 的 a Vecof Boxes :

trait A {}

fn test2<'a, I>(iterator: I) -> Vec<Box<A + 'a>>
where
    I: IntoIterator,
    I::Item: A + 'a,
{
    iterator
        .into_iter()
        .map(|a| Box::new(a))
        .collect::<Vec<Box<A + 'a>>>()
}
Run Code Online (Sandbox Code Playgroud)

然而,这无法编译,并说:

trait A {}

fn test2<'a, I>(iterator: I) -> Vec<Box<A + 'a>>
where
    I: IntoIterator,
    I::Item: A + 'a,
{
    iterator
        .into_iter()
        .map(|a| Box::new(a))
        .collect::<Vec<Box<A + 'a>>>()
}
Run Code Online (Sandbox Code Playgroud)

这个错误有点道理,但我不明白为什么以下内容没有问题:

fn test<'a, T: A + 'a>(t: T) -> Box<A + 'a> { …
Run Code Online (Sandbox Code Playgroud)

boxing iterator rust

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

为什么这个 Rust 代码编译时在结构上有生命周期绑定,但如果绑定仅在 impl 上,则会给出生命周期错误?

最近想写一段类似下面的代码:

pub struct Foo<'a, F> /* where F: Fn(&u32) -> bool */ {
    u: &'a u32,
    f: F
}

impl<'a, F> Foo<'a, F> 
    where F: Fn(&u32) -> bool 
{
    pub fn new_foo<G: 'static>(&self, g: G) -> Foo<impl Fn(&u32) -> bool + '_>
        where G: Fn(&u32) -> bool 
    {
        Foo { u: self.u, f: move |x| (self.f)(x) && g(x) }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里, 的实例Foo表示一段数据 (the u32) 的条件,其中Foo可以通过 由限制较少的数据构建限制性更强的数据new_foo,而不会消耗旧数据。然而,上面的代码并没有像编写的那样编译,而是给出了相当神秘的错误消息:

error[E0308]: mismatched types
 --> src/lib.rs:9:52
  | …
Run Code Online (Sandbox Code Playgroud)

lifetime rust

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

隐式转换如何与运算符重载一起使用?

比方说,如果我出于某种原因在float类型周围创建一个薄包装器,如下所示:

public class WrappedFloat
{

    private float value;

    public WrappedFloat(float value)
    {
        this.value = value;
    }

    public static implicit operator float(WrappedFloat wrapped)
    {
        return wrapped.value;
    }

    public static implicit operator WrappedFloat(float value)
    {
        return new WrappedFloat(value);
    }

}
Run Code Online (Sandbox Code Playgroud)

这段代码显然是完全有效的:

new WrappedFloat(4.0F) + new WrappedFloat(3.0F)
Run Code Online (Sandbox Code Playgroud)

由于WrappedFloat没有定义任何算术运算符,因此必须有一些关于它的隐式转换以float允许它.但是运算符重载只是方法的语法糖,对吧?这不像我可以调用方法(即CompareTo)WrappedFloat因为float有它们.那么这里的运营商有什么特别之处呢?允许这样做的规则是什么?

c# operator-overloading implicit-conversion

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