小编El *_*rko的帖子

一个C++迭代器适配器,它包装和隐藏内部迭代器并转换迭代类型

玩弄了这个,我怀疑它不可能,但我想我会问专家.我有以下C++代码:

class IInterface
{
    virtual void SomeMethod() = 0;
};

class Object
{
    IInterface* GetInterface() { ... }
};

class Container
{
private:
    struct Item
    {
        Object* pObject;
        [... other members ...]
    };
    std::list<Item> m_items;
};

我想将这些方法添加到Container:

    MagicIterator<IInterface*> Begin();
    MagicIterator<IInterface*> End();

为了让呼叫者可以写:

Container c = [...]
for (MagicIterator<IInterface*> i = c.Begin(); i != c.End(); i++)
{
    IInterface* pItf = *i;
    [...]
}

所以基本上我想提供一个类似乎迭代某些集合(其中Begin()和End()的调用者不允许看到)的IInterface指针,但它实际上迭代了指向其他指针的指针集合.对象(Container类专用),可以转换为IInterface指针.

几个关键点:

  • MagicIterator是在外面定义的Container.
  • Container::Item 必须保持私密.
  • MagicIterator有遍历IInterface,指针尽管事实Container持有std::list<Container::Item>.Container::Item包含一个 …

c++ templates iterator adapter wrapper

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

如何使WPF ListView不高于其内容但适合窗口与其他控件?

我正在尝试按如下方式安排WPF UI:

小样

  1. 在窗口的顶部是一些自我确定高度的控件(有效地停靠在窗口的顶部,但是他们想要的高度).
  2. 这些控件下面是ListView.ListView可能包含可变数量的项目,每个项目的高度各不相同.问题: ListView不能高于它需要的高度.如果列表视图中的所有项目都很容易适合窗口,我希望ListView 正好是显示其所有项目的高度(因此窗口看起来像一个网页的流动布局,底部有空白).另一方面,如果所有ListView项目都不适合窗口,我希望整个UI适合窗口(好像下面的数字3停靠在窗口的底部,并且ListView填充了可用空间) .当用户调整窗口大小和/或按下改变列表视图内容的按钮时,这一切都必须动态调整.
  3. 在ListView下面是一些自我确定高度的控件.这些必须始终直接出现在ListView下,没有间隙.特别是如果它们直接适合ListView,它们不能仅停靠在窗口的底部.

解决方案将非常受欢迎; 我已经摆弄了一段时间并且设法让事情工作除了 ListView下面的控件,通过在窗口中使用外部DockPanel,第一个控件停靠在顶部,ListView填充剩余空间但设置为VerticalAlignment ="最佳".

一个纯粹的XAML解决方案是理想的,但如果它不可避免,我不介意代码背后.一个解决方案的奖励点,允许多个这样的安排垂直堆叠:)感谢您的帮助!

wpf listview docking wpf-controls autoresize

14
推荐指数
1
解决办法
2万
查看次数

使用DI/autofac避免嵌套服务定位器反模式

在之前的游戏项目中,我有一些方便的服务定位器反模式.我想用依赖注入替换它.autofac看起来像我最容易的DI容器,因为它似乎有相关的功能 - 但我无法弄清楚如何实现我正在寻找的东西.

现有方法

我有一个服务定位器而不是单个服务定位器,它可以委托给它的父节点(实际上提供"范围"服务):

class ServiceLocator {
    ServiceLocator _parent;
    Dictionary<Type, object> _registered = new Dictionary<Type, object>();

    public ServiceLocator(ServiceLocator parent = null) {
        _parent = parent;
    }

    public void Register<T>(T service) {
        _registered.Add(typeof(T), service);
    }

    public T Get<T>() {
        object service;
        if (_registered.TryGetValue(typeof(T), out service)) {
            return (T)service;
        }
        return _parent.Get<T>();
    }
}
Run Code Online (Sandbox Code Playgroud)

为简洁起见,游戏由一组Component派生类组成:

abstract class Component {
    protected ServiceLocator _ownServices;
    protected List<Component> _components = new List<Component>();
    ...

    public Component(ServiceLocator parentServices) {
        _ownServices = new ServiceLocator(parentServices);
    }

    ... …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection circular-dependency autofac

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