小编lee*_*mes的帖子

JavaScript闭包与匿名函数

我的一个朋友和我正在讨论什么是JS的封闭,什么不是.我们只是想确保我们真正理解它.

我们来看看这个例子吧.我们有一个计数循环,并希望在控制台上打印计数器变量延迟.因此,我们使用setTimeout闭包来捕获计数器变量的值,以确保它不会打印值N的N倍.

错误的解决方案,无需关闭或接近任何倒闭将是:

for(var i = 0; i < 10; i++) {
    setTimeout(function() {
        console.log(i);
    }, 1000);
}
Run Code Online (Sandbox Code Playgroud)

这当然会打印10次i循环后的值,即10.

所以他的尝试是:

for(var i = 0; i < 10; i++) {
    (function(){
        var i2 = i;
        setTimeout(function(){
            console.log(i2);
        }, 1000)
    })();
}
Run Code Online (Sandbox Code Playgroud)

按预期打印0到9.

我告诉他,他并没有使用封闭捕获i,但他坚持认为他是.我证明他没有使用闭包,将for循环体放在另一个setTimeout(将他的匿名函数传递给setTimeout),再次打印10次10​​.如果我将他的函数存储在a中var并在循环之后执行它同样适用,也打印10次10​​.所以我的论点是他并没有真正捕获它的值i,使他的版本不是一个闭包.

我的尝试是:

for(var i = 0; i < …
Run Code Online (Sandbox Code Playgroud)

javascript closures scope

551
推荐指数
10
解决办法
11万
查看次数

为什么在我的`INSERT ... ON DUPLICATE KEY UPDATE`中影响了2行?

我正在INSERT ... ON DUPLICATE KEY UPDATEPRIMARY KEY下表中的a 做一个:

DESCRIBE users_interests;
Run Code Online (Sandbox Code Playgroud)
+------------+---------------------------------+------+-----+---------+-------+
| Field      | Type                            | Null | Key | Default | Extra |
+------------+---------------------------------+------+-----+---------+-------+
| uid        | int(11)                         | NO   | PRI | NULL    |       |
| iid        | int(11)                         | NO   | PRI | NULL    |       |
| preference | enum('like','dislike','ignore') | YES  |     | NULL    |       |
+------------+---------------------------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)

但是,即使这些值应该是唯一的,我也会看到2行受到影响.

INSERT INTO users_interests (uid, iid, preference) VALUES (2, 2, 'like')
ON DUPLICATE KEY UPDATE …
Run Code Online (Sandbox Code Playgroud)

mysql insert insert-update

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

使自定义类型"绑定"(与std :: tie兼容)

考虑我有一个自定义类型(我可以扩展):

struct Foo {
    int a;
    string b;
};
Run Code Online (Sandbox Code Playgroud)

如何将此对象的实例分配给a std::tie,即std::tuple引用?

Foo foo = ...;

int a;
string b;

std::tie(a, b) = foo;
Run Code Online (Sandbox Code Playgroud)

尝试失败:

tuple<int&,string&> = Foo由于赋值运算符是必须是左侧对象成员的二元运算符之一,因此无法重载赋值运算符.

所以我试图通过实现一个合适的元组转换运算符来解决这个问题.以下版本失败:

  • operator tuple<int,string>() const
  • operator tuple<const int&,const string&>() const

它们导致赋值错误,告诉" operator =没有超载tuple<int&,string&> = Foo".我想这是因为"转换为任何类型的X +推导模板参数X for operator ="不能同时工作,只能同时使用其中一个.

不完美的尝试:

因此,我尝试为绑定确切类型实现转换运算符:

  • operator tuple<int&,string&>() const   Demo
  • operator tuple<int&,string&>()   Demo

现在分配工作,因为类型现在(转换后)完全相同,但这不适用于我想支持的三种情况:

  1. 如果tie有不同但可转换类型的变量绑定(即更改int a;long long a;客户端),则失败,因为类型必须完全匹配.这与将元组分配给允许可转换类型的引用元组的通常用法相矛盾.(1)
  2. 转换运算符需要返回一个必须给出左值引用的平局.这不适用于临时值或const成员. …

c++ tuples std c++11

50
推荐指数
3
解决办法
4588
查看次数

编写一个"真正的"交互式终端程序,如vim,htop,...在C/C++中没有ncurses

不,我不想使用ncurses,因为我想了解终端是如何工作的,并且可以自己编程.:)它不必是可移植的,它只能在基于linux xterm的终端模拟器上工作.

我想要做的是编写一个交互式终端应用程序,如htop和vim.我的意思不是字符的输出看起来像盒子或设置颜色,这是微不足道的; 还要使内容适合窗口大小.我需要的是

  1. 如何进行鼠标交互,比如单击一个字符并滚动鼠标滚轮(当鼠标处于特定字符时)以实现滚动[ 编辑:当然在终端模拟器中 ],以及

  2. 如何完全保存和恢复父进程的输出并从输出中分离我的打印,所以在离开我的应用程序后,我在shell中输入的命令应该在那里,就像运行htop并再次退出时一样:什么都看不见从这个应用程序.

我真的不想使用ncurses.但是,当然,如果您知道ncurses的哪一部分负责这些任务,欢迎您告诉我在源代码中我可以找到它,所以我将研究它.

c c++ terminal interactive

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

删除decltype中的引用(返回T而不是T&,其中T&是decltype)

(如果您是C++ 11专业版,请跳到粗体段.)

假设我想编写一个模板方法,该方法调用并返回传递对象的结果,该对象的类型是模板参数:

template<ReturnType, T>
ReturnType doSomething(const T & foo) {
    return foo.bar(); // EDIT: Might also be an expression introducing a temp val
}
Run Code Online (Sandbox Code Playgroud)

所以T必须有一个方法ReturnType T::bar() const才能在这样的调用中使用:

struct MyClass {
    ...
    int bar() const;
    ...
};
...
MyClass object;
int x = doSomething<int, MyClass>(object);
Run Code Online (Sandbox Code Playgroud)

MyClass感谢类型扣除,我们无需写信,调用成为:

int x = doSomething<int>(object);
Run Code Online (Sandbox Code Playgroud)

但是省略<int>也会导致编译错误,因为该方法不需要返回int以便x以后分配(char例如,它可以返回).

在C++ 0X/11,我们有autodecltype,使我们可以用它来推断模板方法的返回类型:

template<T>
auto doSomething(const T & foo) -> decltype(foo.bar()) {
    return foo.bar(); // …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11 type-deduction

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

QPainterPaths的高效离屏渲染(需要OpenGL和非OpenGL解决方案)

  1. 在我的应用程序中,我使用QPaintera 绘制街道地图widget
    • QPainterPaths它制作包含预先绘制的路径
    • widget目前是QWidget,不是QGLWidget,但这可能会改变.
  2. 我正试图将这幅画移出屏幕并将其拆分成大块的工作
    • 我想将每个块QImage绘制成a 并最终将所有图像绘制到widget
    • QPainterPaths 已经分块了,所以这不是问题
    • 问题是,绘图比绘图QImages5倍QWidget
  3. 我做过一些基准测试
    • 时间值是多次运行的四舍五入平均值
    • test chunk包含100个QPainterPaths,每个有大约150个线性线段
    • 使用QPainter::Antialiasing渲染提示绘制大约15k路径,QPen使用圆顶和圆形连接
  4. 请记住,我的来源是QPainterPaths(和线宽+颜色;一些绘制,一些填充)
    • 我不需要所有其他类型的绘图QPainter支持
    • 可以QPainterPaths转换为可以在a上绘制的其他东西OpenGL buffer,这将是一个很好的解决方案.
    • 我不熟悉OpenGL屏幕外渲染,我知道有不同类型的OpenGL缓冲区,其中大多数不是用于2D图像渲染而是用于顶点数据.
Paint Device for chunk | Rendering the chunk itself | Painting chunk on QWidget
-----------------------+----------------------------+--------------------------
QImage                 |                    2000 ms |                   < …
Run Code Online (Sandbox Code Playgroud)

c++ opengl qt qpainter

45
推荐指数
1
解决办法
4105
查看次数

什么是带有两个参数的decltype?

编辑,为了避免混淆:decltype接受两个参数.看到答案.

以下两个结构可用于T在编译期间检查类型上成员函数的存在性:

// Non-templated helper struct:
struct _test_has_foo {
    template<class T>
    static auto test(T* p) -> decltype(p->foo(), std::true_type());

    template<class>
    static auto test(...) -> std::false_type;
};

// Templated actual struct:
template<class T>
struct has_foo : decltype(_test_has_foo::test<T>(0))
{};
Run Code Online (Sandbox Code Playgroud)

我认为这个想法是在检查成员函数的存在时使用SFINAE,因此如果p->foo()无效,则只test返回返回的省略号版本std::false_type.否则,第一个方法被定义T*并将返回std::true_type.实际的"切换"发生在第二个类中,它继承自返回的类型test.与不同的方法相比,这看起来更聪明,更"轻巧" is_same.

decltype与两个参数第一次看令我感到诧异,因为我认为这只是得到一个表达式的类型.当我看到上面的代码时,我认为它类似于"尝试编译表达式并始终返回第二种类型.如果表达式无法编译则失败"(所以隐藏此专业化; SFINAE).

但:

然后我想我可以使用这个方法来编写任何"is valid expression"检查器,只要它依赖于某种类型T.例:

...
    template<class T>
    static auto test(T* p) -> decltype(bar(*p), std::true_type());
...
Run Code Online (Sandbox Code Playgroud)

http://ideone.com/dJkLPF

这一点,所以我想,将返回 …

c++ decltype sfinae type-traits c++11

43
推荐指数
2
解决办法
6725
查看次数

为什么sizeof(BaseClass)== sizeof(DerivedClass)虽然我添加了一个成员

从下面的代码sizeof(Base) == 24sizeof(Derived) == 24.

为什么他们的尺寸相同?

Base课堂上我们有3名成员,在Derived课堂上我们有另一名成员.

class Base
{
private:
    double d;
protected:
    long l;
public:
    int i;
};

class Derived : public Base
{
private:
    float f;
};
Run Code Online (Sandbox Code Playgroud)

c++ oop sizeof

40
推荐指数
3
解决办法
2504
查看次数

在bash脚本中使用"备用屏幕"

备用屏幕用于通过像vim,HTOP,屏幕,alsamixer中,以下,...它像一个不同缓冲液中的终端的内容的,其消失的应用程序退出时,所以整个终端许多"用户交互式"应用终端恢复,看起来应用程序没有输出任何东西.

我想在我自己的shell(bash)脚本中实现完全相同的东西,除了它不必是可移植的.我坚持只使用linux和基于xterm的终端模拟器; 但解决方案应该使用像tput是否可能的东西.但是,我不想使用某些外部脚本语言(甚至是类似C的东西).

虽然我不想使用C(因为它应该是尽可能少的依赖项的bash脚本),但我查看了较少的源代码.它似乎使用terminfo作为数据库,并在其初始化中查找"ti"终端功能.删除行时,它不使用备用的sceen,所以我假设我找到了负责的代码行.

但是,我找不到这样的能力man terminfo.但也许我在错误的道路上寻找解决方案.也许terminfo/tput不是我的朋友.

那么(如何)我可以在bash脚本中使用备用屏幕?有人知道一个简单的应用程序,我可以在其中找到源代码提示吗?(C应用程序或bash脚本或其他......)

linux bash terminal terminfo

36
推荐指数
3
解决办法
6747
查看次数

for(auto i:c) - 在反向方向上有一个简短的方法吗?

我有一个自定义容器类和定义的迭代器,所以我可以这样做:

for (auto i : c)
Run Code Online (Sandbox Code Playgroud)

但有反向迭代的东西吗?

就像是:

for_reverse (auto i : c)
Run Code Online (Sandbox Code Playgroud)

c++

36
推荐指数
2
解决办法
6769
查看次数