我想知道如何正确检查是否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(显然)不是指针.
为什么纯净如果有效?它背后的魔力是什么?而且,这是检查它的正确方法吗?
我有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)
谢谢
我想知道是否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)
这是正确的假设吗?
我有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)仅包含RoleId和UserId.
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作为额外的实 能够在关系中添加额外数据吗?代价是无法从用户导航到角色?
我正在研究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具有属性quaternion和useQuaternion但似乎不起作用,错误是由场景加载器引发的(可能是因为缺少"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) 我正在使用Visual Profiler 6.0对CUDA内核进行性能分析,几乎在每一行上都有一个栏,显示Inactive threads和的百分比Predicated off threads。
我想知道这两个值到底是什么意思,它们有多“不好”?
据我所知,Inactive threads(以红色显示)是发散且处于非活动状态的线程(由于某些if语句)和Predicated off threads(以蓝色显示)是由编译器正确确定为处于非活动状态的线程。那是对的吗?
如果是这样,我不明白为什么内核中的以下几行有95%的非活动线程,唯一的if是循环:

在TFloat对于两种模板float或double类型。是什么导致那里的线程不活动?
我正在使用CUDA 6.0,并且代码在具有计算能力3.5的Tesla K40c上运行。
OpenTK提供了两种使用OpenGL的方法:
GlControl 这是标准的WinForms控件,和我使用的是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# ×2
c++ ×2
3d ×1
c++11 ×1
cuda ×1
javascript ×1
opengl ×1
opentk ×1
performance ×1
profiling ×1
quaternions ×1
std-function ×1
three.js ×1