相关疑难解决方法(0)

为什么没有将产量添加到C++ 0x?

我在许多Python程序中都使用了yield,在很多情况下它确实清除了代码.我在博客上写了这篇文章,这是我网站的热门网页之一.

C#还提供了收益 - 它通过调用者端的状态保持来实现,通过自动生成的类来完成,该类保持状态,函数的局部变量等.

我目前正在阅读有关C++ 0x及其添加的内容; 在阅读有关C++ 0x中lambda的实现时,我发现它也是通过自动生成的类完成的,配备了存储lambda代码的operator().我心中形成了一个自然的问题:他们是为lambdas做过的,他们为什么不考虑支持"收益"呢?

当然,他们可以看到合作例程的价值......所以我只能猜测他们认为基于宏的实现(例如Simon Tatham的)是一个充分的替代品.然而,它们不是出于多种原因:被调用者保持状态,非重入状态,基于宏观(仅此一点是足够的理由)等.

编辑: yield不依赖于垃圾收集,线程或光纤.您可以阅读Simon的文章,看看我在谈论编译器进行简单的转换,例如:

int fibonacci() {
    int a = 0, b = 1;
    while (true) {
        yield a;
        int c = a + b;
        a = b;
        b = c;
    }
}
Run Code Online (Sandbox Code Playgroud)

成:

struct GeneratedFibonacci {
    int state;
    int a, b;

    GeneratedFibonacci() : state (0), a (0), b (1) {}

    int operator()() {
        switch (state) {
        case 0:
            state = 1;
            while (true) { …
Run Code Online (Sandbox Code Playgroud)

c++ yield c++11 c++17

30
推荐指数
4
解决办法
9139
查看次数

C#中C++的C++相当于?

public void Consumer()
{
    foreach(int i in Integers())
    {
        Console.WriteLine(i.ToString());
    }
}

public IEnumerable<int> Integers()
{
    yield return 1;
    yield return 2;
    yield return 4;
    yield return 8;
    yield return 16;
    yield return 16777216;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法用模板技巧(或其他)在c ++中获得相同的语法?

c++

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

C++ 11 lambda返回lambda

这段代码并不是JS开发人员所不知道的

function get_counter()
{
    return (
        function() {
            var c = 0;
            return function() { return ++c; };
        })();
}
Run Code Online (Sandbox Code Playgroud)

它基本上创建了一个创建不同的枚举器.所以我想知道在使用新的lambda语义的C++ 11中是否可以做同样的事情?我最终写了这篇C++,遗憾的是它不能编译!

int main()
{
    int c;
    auto a = [](){
        int c = 0;
        return [&](){
            cout << c++;
        };
    };
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我想知道是否有一个解决方法来编译它,如果有编译器如何使这个代码正确运行?我的意思是它必须创建单独的枚举器,但它也应该收集垃圾(未使用的c变量).

顺便说一句,我正在使用VS2012编译器,它会生成此错误:

Error   2   error C2440: 'return' : cannot convert from 'main::<lambda_10d109c73135f5c106ecbfa8ff6f4b6b>::()::<lambda_019decbc8d6cd29488ffec96883efe2a>' to 'void (__cdecl *)(void)'    c:\users\ali\documents\visual studio 2012\projects\test\test\main.cpp   25  1   Test
Run Code Online (Sandbox Code Playgroud)

c++ lambda visual-c++ c++11 visual-studio-2012

22
推荐指数
3
解决办法
8431
查看次数

用于缓冲读取的C++中的python生成器的等效项

Guido Van Rossum在本文中演示了Python的简单性,并利用此函数对未知长度的文件进行缓冲读取:

def intsfromfile(f):
    while True:
        a = array.array('i')
        a.fromstring(f.read(4000))
        if not a:
            break
        for x in a:
            yield x
Run Code Online (Sandbox Code Playgroud)

出于速度原因,我需要在C++中做同样的事情!我有很多文件包含我需要合并的无符号64位整数的排序列表.我找到了用于合并向量的这段代码.

我坚持如何为一个未知长度的文件创建一个ifstream作为一个向量,可以愉快地迭代,直到到达文件的末尾.有什么建议?我用istreambuf_iterator吠叫正确的树吗?

c++ python algorithm io file

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

标签 统计

c++ ×4

c++11 ×2

algorithm ×1

c++17 ×1

file ×1

io ×1

lambda ×1

python ×1

visual-c++ ×1

visual-studio-2012 ×1

yield ×1