小编Nig*_*fik的帖子

如何在C++ 11中正确检查std :: function是否为空?

我想知道如何正确检查是否std::function为空.考虑这个例子:

class Test {
    std::function<void(int a)> eventFunc;

    void registerEvent(std::function<void(int a)> e) {
        eventFunc = e;
    }

    void doSomething() {
        ...
        eventFunc(42);
    }
};
Run Code Online (Sandbox Code Playgroud)

这段代码在MSVC中编译得很好,但如果我在doSomething()没有初始化的情况下调用eventFunc代码,那么显然会崩溃.这是预期的,但我想知道它的价值是eventFunc多少?调试器说'empty'.所以我使用简单的if语句修复了它:

   void doSomething() {
        ...
        if (eventFunc) {
            eventFunc(42);
        }
   }
Run Code Online (Sandbox Code Playgroud)

这有效,但我仍然想知道非初始化的价值是std::function多少?我想写,if (eventFunc != nullptr)std::function(显然)不是指针.

为什么纯净如果有效?它背后的魔力是什么?而且,这是检查它的正确方法吗?

c++ c++11 std-function

87
推荐指数
3
解决办法
5万
查看次数

如何在为HtmlHelper编写扩展时调用UrlHelper

我有ASP.NET MVC3项目,我正在编写一些返回HTML的扩展方法,但我需要UrlHelper来渲染它们.要做到这一点,我正在扩展UrlHelper,但我不喜欢语义,因为UrlHelper应该使用URL和HtmlHelper与HTML.我想用这种方法扩展HtmlHelper而不是UrlHelper.

我的问题是我现在不知道如何从HtmlHelper的扩展方法访问UrlHelper,它甚至可能吗?或者我必须坚持使用UrlHelper扩展.

我知道我可以发送Url helper作为参数,但我不太喜欢这个解决方案.

以下代码是我正在讨论的扩展方法的示例:

public static HtmlString AnchorLink(this UrlHelper url, string text, string action, string anchor) {
    return new HtmlString(string.Format("<a href=\"{0}#{2}\">{1}</a>", url.Action(action), text, anchor));
}
Run Code Online (Sandbox Code Playgroud)

谢谢

extension-methods asp.net-mvc-3

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

Pow()与exp()表现

我想知道是否exp()比一般更快pow().我在JsPerf http://jsperf.com/pow-vs-exp上运行快速基准测试,它为我显示了有趣的结果.

Math.exp(logBase * exponent);  // fastest
Math.exp(Math.log(base) * exponent);  // middle
Math.pow(base, exponent);  // slowest
Run Code Online (Sandbox Code Playgroud)

我知道结果会因架构和语言而异,但我也对理论观点感兴趣.被pow(a, b)实现为exp(log(a) * b)或者是有一些更聪明的办法是如何合作的计算能力"直接"(在C++,C#或JavaScript).在某些体系结构上是否有针对exp,log或pow的CPU指令?

据我所知,两者都使用一些泰勒级数来计算,exp()并且log()计算成本非常高.这让我相信,对于恒定的功率基础,这段代码

double logBase = log(123.456);
for (int i = 0; i < 1024; ++i) {
    exp(logBase * 654.321);
}
Run Code Online (Sandbox Code Playgroud)

比这更好

for (int i = 0; i < 1024; ++i) {
    pow(123.456, 654.321);
}
Run Code Online (Sandbox Code Playgroud)

这是正确的假设吗?

javascript performance

11
推荐指数
2
解决办法
5176
查看次数

如何在ASP.NET MVC 5中列出具有角色名称的用户

我有ASP.NET MVC 5网站的默认项目模板,我试图列出具有角色名称(而不是ID)的所有用户.

查询是:

db.Users.Include(u => u.Roles).ToList()
Run Code Online (Sandbox Code Playgroud)

然后我想用以下内容打印角色名称:

@string.Join(", ", user.Roles.Select(r => r.RoleId))
Run Code Online (Sandbox Code Playgroud)

问题是我只能访问RoleId,而不是Name存储其他属性的Role类.

我可以运行另一个select来获取所有角色,然后将其用作查找.或者直接在查询中写一个连接?我不知道是怎么回事,因为我无法访问IdentityUserRole具有绑定用户和角色的实体的表.

问题的根源似乎是Roles集合IdentityUserRole(非Role)仅包含RoleIdUserId.

public class IdentityUserRole<TKey> {
    public virtual TKey RoleId { get; set; }
    public virtual TKey UserId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我想如果想要在EF中做N对N关系,他们应该直接收集Roles然后覆盖OnModelCreating并指定关系.这种方法似乎使从一个对象浏览对象变得复杂.

为什么他们决定将其IdentityUserRole作为额外的实 能够在关系中添加额外数据吗?代价是无法从用户导航到角色?

c# entity-framework-6 asp.net-mvc-5 asp.net-identity-2

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

如何在Three.js json场景中使用四元数旋转

我正在研究L系统解释器,我使用四元数作为旋转的内部表示.我需要将结果导出到ThreeJs JavaScript场景,我发现json场景是最好的方法.

我在https://github.com/mrdoob/three.js/blob/master/examples/scenes/test_scene.js上找到了一个场景示例,但没有关于四元数旋转的内容.

所以我在http://threejs.org/io/s/quaternion上使用了帮助,发现,THREE.Object3D具有属性quaternionuseQuaternion但似乎不起作用,错误是由场景加载器引发的(可能是因为缺少"rotation"属性,请参见末尾的EDIT):

"obj": {
    ...
    "quaternion": [0.38268343236509,0,0,0.923879532511287],
    "useQuaternion": true
}
Run Code Online (Sandbox Code Playgroud)

我也尝试将四元数转换为欧拉角,但它不适合我,可能是因为应用角度的其他顺序(我假设Y,Z,X顺序).在上面的例子中,四元数表示绕Z轴(音高)旋转135度,这被转换为欧拉角[pi,pi,pi/4],但在场景中显示不正确.

下图显示了每个Z轴比其他轴旋转了11度的块.轴是X(红色),Y(绿色)和Z(蓝色).由于不正确的转换四元数到Euclid,上半部分旋转不正确(我使用此页面实现:http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToEuler/).

解决问题
编辑:进一步检查后,场景加载器引发的错误是由于对象上缺少"旋转"属性.输出后不抛出错误并加载场景但是错误(与所示图像的方式相同),因为四元数旋转被忽略.

"obj": {
    ...
    "rotation": [3.14159265358979,3.14159265358979,0.785398163397449],
    "quaternion": [0.38268343236509,0,0,0.923879532511287],
    "useQuaternion": true
}
Run Code Online (Sandbox Code Playgroud)

3d quaternions three.js

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

CUDA中的非活动线程与断言线程

我正在使用Visual Profiler 6.0对CUDA内核进行性能分析,几乎在每一行上都有一个栏,显示Inactive threads和的百分比Predicated off threads

我想知道这两个值到底是什么意思,它们有多“不好”?

据我所知,Inactive threads(以红色显示)是发散且处于非活动状态的线程(由于某些if语句)和Predicated off threads(以蓝色显示)是由编译器正确确定为处于非活动状态的线程。那是对的吗?

如果是这样,我不明白为什么内核中的以下几行有95%的非活动线程,唯一的if是循环:

非活动线程打印屏幕

TFloat对于两种模板floatdouble类型。是什么导致那里的线程不活动?

我正在使用CUDA 6.0,并且代码在具有计算能力3.5的Tesla K40c上运行。

c++ profiling cuda

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

如何在OpenTK中的GlControl中实现更好的抗锯齿?

OpenTK提供了两种使用OpenGL的方法:

  1. GlControl 这是标准的WinForms控件,和
  2. 具有OpenGL上下文的本机窗口.

我使用的是GlControl,FSAA看起来质量很差.我正在开发一个围绕OpenGL控件的许多控件的应用程序,所以我有点被迫使用GlControl.

有没有办法在GLControl中实现更好的抗锯齿(例如超级采样)?在我的应用程序中,我渲染了许多具有像素或甚至子像素大小的东西,而当前的FSAA并没有很好地处理它.

我在构造函数中看到一个指定缓冲区数量的参数,将这个数字设置为(比方说)6并渲染4个样本,将它们组合到第5个缓冲区并与第6个交换是否可行?或者,如何自己实施SSAA最简单的方法是什么?

这就是我如何创建GlControl,即8FSAA的样本数量:

glControl = new GLControl(new OpenTK.Graphics.GraphicsMode(32, 24, 0, 8));
Run Code Online (Sandbox Code Playgroud)

更新:这是一个8x FSAA的GlControl打印屏幕.我检查了我的驱动程序设置,然后说Antializaing mode = Application controlled.

别名示例

UPDATE2:好的,这是可怕的尴尬,在NVIDIA控制面板中有另一个选项Antialiasing - transparency被设置为Off.我没有注意,因为我认为这是一些alpha混合的东西,但我错了.我设置它8x (supersample),现在GlControl确实是8xSSAA.

别名固定

c# opengl opentk

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