小编dlf*_*dlf的帖子

在膨胀布局以用于MenuItem的ActionView时,我应该为root传递什么?

我有一个ImageView我附加到MenuItemActionView(项目出现在ActionBar).此视图的布局来自XML.我这样膨胀它:

ImageView actionView = (ImageView) layoutInflater.inflate(
   R.layout.action_view_layout, null);
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常.然而; root在调用中传递null inflate()使Lint对我大喊:

避免将null作为视图根传递(需要解析膨胀布局的根元素上的布局参数)

在我的具体情况下,我似乎可以在没有root的情况下进行管理,但我宁愿让代码尽可能正确.问题是,我不确定哪个View应该用作根.这个答案说它应该是"围绕想要膨胀的视图对象的小部件".但这意味着什么呢?动作栏的那一个?活动?还有别的吗?


更新:阅读答案让我怀疑我正确的做法是:

  1. 得到ActionBar View对应的MenuItem
  2. 扎根吧
  3. 把根投成一个 ViewGroup
  4. 将结果传递给inflater

这似乎有效.任何人都可以确认或否认这是否应该做什么?

android actionview menuitem android-layout layout-inflater

37
推荐指数
3
解决办法
2万
查看次数

***const参考是否延长了临时生命?

曾几何时,我认为像这样的代码会失败:

const MyClass& obj = MyClass();
obj.DoSomething();
Run Code Online (Sandbox Code Playgroud)

因为MyClass对象将在其完整表达式的末尾被销毁,而将obj作为悬空引用.但是,我(这里)得知这不是真的; 该标准实际上有一个特殊的规定,允许const引用保持临时值,直到所述引用被自己销毁.但是,有人强调,只有const引用具有这种能力.今天我在VS2012中运行了以下代码作为实验.

struct Foo
{
    Foo() { std::cout << "ctor" << std::endl; }
    ~Foo() { std::cout << "dtor" << std::endl; }
};

void f()
{
    Foo& f = Foo();
    std::cout << "Hello world" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

调用时的输出f()是:

ctor  
Hello world  
dtor  
Run Code Online (Sandbox Code Playgroud)

所以我查看了C++ 11草案标准,并且只发现了这个(§12.2/ 4):

有两种情况,临时表在与完整表达结束时不同的地方被摧毁.第一个背景[不适用].第二个上下文是引用绑定到临时的.绑定引用的临时对象或绑定引用的子对象的完整对象的临时对象在引用的生命周期内持续存在.

const上面显然没有这个词.所以; 有没有为C++ 11改变这种行为,我const开始的事情是错的,还是VS2012有一个bug,我还没有找到标准的相关部分?

c++ language-lawyer c++11 visual-studio-2012

16
推荐指数
3
解决办法
991
查看次数

可以将过期的weak_ptr与未初始化的weak_ptr区分开来吗?

例如:

std::weak_ptr<int> wp1(std::make_shared<int>());
std::weak_ptr<int> wp2;

assert(PointsToValidOrExpiredObject(wp1));
assert(!PointsToValidOrExpiredObject(wp2));
Run Code Online (Sandbox Code Playgroud)

这样的功能可能吗?

用例:类的构造函数std::weak_ptr<Foo>作为依赖项.传递过期的对象是可以的(可能在某些工作流程中发生),但传递null意味着程序员忘记了某些事情.我想测试它作为构造函数的参数验证的一部分.

c++ weak-ptr c++11

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

Unity:更改默认生命周期管理器以进行隐式注册和/或禁用它们

Unity容器将自动解析它可以自己解决的任何类型,而无需手动注册.这在某些方面很好,但我遇到的问题是它使用了TransientLifetimeManager这种类型的分辨率,而我几乎总是想要一个ContainerControlledLifetimeManager.当然,我仍然可以手动将我的类型注册为单身人士,但如果我忘了,而不是在启动时获得未处理的异常,应用程序将成功启动,一切似乎都有效.但是最终会出现一些错误,可能是非常微妙的,难以诊断的错误,因为有一个类型的多个实例意味着单身.

所以我的问题是:有没有办法可以指定不同的默认生命周期管理器或完全禁用默认的自动解析行为,并将容器限制为我自己注册的类型(直接或通过我自己的约定)?

.net c# dependency-injection unity-container

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

无法在boost 1.57中编译boost/any_iterator.hpp

在(尝试)升级VS2012项目以使用boost 1.57之后,我无法再编译 - 出现了大量的错误消息boost/any_iterator.hpp(见下文).作为测试,我创建了一个新项目,其中只包含一个空主函数,#include "boost/any_iterator.hpp"并且得到了相同的错误集.这是它抱怨的代码:

// snippet from boost/any_iterator.hpp

template<
            class Value
          , class Traversal
          , class Reference
          , class Difference
          , class Buffer
        >
        class postfix_increment_proxy<
                    range_detail::any_iterator< // line 131
                        Value
                      , Traversal
                      , Reference
                      , Difference
                      , Buffer
                    >
                >
        {
            // ...
        };
Run Code Online (Sandbox Code Playgroud)

同一文件中有另一个类遵循相同的模式并生成相同的错误.range_detail::any_iterator在文件中向前声明更高一点:

namespace range_detail
{
   // ...
   template<
                class Value
              , class Traversal
              , class Reference
              , class Difference
              , class Buffer = any_iterator_default_buffer
            >
            class any_iterator;
    // ... …
Run Code Online (Sandbox Code Playgroud)

c++ boost compiler-errors

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

当作为具有接口约束的通用参数传递时,值类型是否装箱?

(作为回答这个问题的研究结果,我(我想我已经!)确定答案是"不".但是,我不得不在几个不同的地方看看这个,所以我觉得还有这个问题很有价值.但如果社区投票结束,我不会感到沮丧.)

例如:

void f<T>(T val) where T : IComparable
{
   val.CompareTo(null);
}

void g()
{
   f(4);
}
Run Code Online (Sandbox Code Playgroud)

4盒装?我知道明确地将值类型转换为它实现触发装箱的接口:

((IComparable)4).CompareTo(null); // The Int32 "4" is boxed
Run Code Online (Sandbox Code Playgroud)

我不知道的是,将值类型作为具有接口约束的泛型参数传递是否等于执行转换 - 语言"其中T是IC Comparable" 类似于建议转换,但只是转变TIComparable似乎它会打败通用的全部目的!

为了澄清,我想确保在上面的代码中没有发生这些事情:

  1. g调用时f(4),由于对参数类型有约束,因此4被强制转换IComparable为.IComparablef
  2. 假定(1)不发生,内f,val.CompareTo(null)不投valInt32IComparable为了调用CompareTo.

但我想了解一般情况; 不只是ints和IComparables 会发生什么.

现在,如果我将以下代码放入LinqPad:

void Main()
{
    ((IComparable)4).CompareTo(null);
    f(4);
}

void f<T>(T val) where T …
Run Code Online (Sandbox Code Playgroud)

c# generics clr boxing type-constraints

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

它是否违反了非缺省可构造结构的标准,缺少用户定义的构造函数?

可以定义struct(a)没有用户定义的构造函数,(b)不能生成默认构造函数.例如,Foo在下面:

struct Baz
{
   Baz(int) {}
};

struct Foo
{
   int bar;
   Baz baz;
};
Run Code Online (Sandbox Code Playgroud)

您仍然可以创建Foo使用聚合初始化的实例:

Foo foo = { 0, Baz(0) };
Run Code Online (Sandbox Code Playgroud)

我的普通编译器(VS2012)会勉强接受这个,但它会引发2个警告:

警告C4510:'Foo':无法生成默认构造函数.

警告C4610:struct'Foo'永远不能被实例化 - 需要用户定义的构造函数

当然,我刚刚证明警告#2错误 - 你仍然可以使用聚合初始化来实例化它.我尝试过的在线编译器很高兴接受上述内容,因此我猜测VS2012只是过于激进了这个警告.但我想确定 - 这段代码是否正常,还是技术上违反了标准中一些不起眼的部分?

c++ default-constructor language-lawyer aggregate-initialization visual-studio-2012

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

在泛型类的成员上使用nameof而不指定类型参数

class Foo<T>
{
   public T Bar() { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)

我想把Bar的名字传递给Type.GetMethod(string).我可以这样做someType.GetMethod(nameof(Foo<int>.Bar)),但这完全int是武断的; 有什么办法可以省略吗?可悲的是,nameof(Foo<>.Bar)不起作用.

在这个玩具案例中并没有什么大不了的,但是如果有多个类型参数,特别是如果它们where附加了约束,那么拼写它们就可以成为一项任务.

c# c#-6.0 nameof

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

VS2015更新2:缺少"使用项目初始化交互"选项

根据Visual Studio 2015更新2 发行说明,现在可以使用所选项目的上下文初始化C#交互式环境.这些博客 文章中进一步描述了此功能.但是,他们谈论并在屏幕截图中显示的"初始化交互式项目"菜单选项根本不适合我(虽然我在编辑器中选择代码时看到相关的新"交互式执行"选项).

我正在使用:

在此输入图像描述

有什么线索可能有什么问题?有没有人看到这个功能?

更新:只是为了证明它真的不存在:

在此输入图像描述

c# visual-studio visual-studio-2015 c#-interactive

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

System.Reactive 5.0 中缺少 DispatcherScheduler

我正在尝试将我的 .net Framework 4.7.2 项目从 System.Reactive 4.4 升级到 5.0。然而,DispatcherScheduler 和将 Dispatcher 转换为 IScheduler 的扩展方法似乎在这两个版本之间都消失了。它们已经过时了吗?移动到不同的包?

.net wpf system.reactive

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