我正在尝试使用C++ 11功能来使自定义流操纵器更容易创建.我可以使用lambda函数作为操纵符,但不是std::function<ostream&(ostream&)>.
这是代码,归结为:
#include <iostream>
#include <functional>
using namespace std;
auto lambdaManip = [] (ostream& stream) -> ostream& {
stream << "Hello world" << endl;
};
function<ostream& (ostream&)> functionManip = [] (ostream& stream) -> ostream& {
stream << "Hello world" << endl;
};
int main (int argc, char** argv) {
cout << lambdaManip; // OK
cout << functionManip; // Compiler error
}
Run Code Online (Sandbox Code Playgroud)
第二个cout语句失败,并带有以下内容:
g++-4 src/Solve.cpp -c -g -std=c++0x -o src/Solve.o -I/home/ekrohne/minisat
src/Solve.cpp: In function 'int main(int, …Run Code Online (Sandbox Code Playgroud) 问题安全遍历WeakKeyDictionary和WeakValueDictionary没把我放心,因为我所希望的,而它的老不够,它的价值再次询问,而不是评论。
假设我有一个MyHashable可哈希的类,并且我想构建一个WeakSet:
obj1 = MyHashable()
obj2 = MyHashable()
obj3 = MyHashable()
obj2.cycle_sibling = obj3
obj3.cycle_sibling = obj2
ws = WeakSet([obj1, obj2, obj3])
Run Code Online (Sandbox Code Playgroud)
然后,我删除一些局部变量,并转换为列表,为以后的循环做准备:
del obj2
del obj3
list_remaining = list(ws)
Run Code Online (Sandbox Code Playgroud)
我举这个问题似乎声称这是蛮好的,但即使没有任何明确的for循环,我已不是已经冒着循环垃圾收集器的构造过程中踢list_remaining和更改集的大小?我希望这个问题非常罕见,以至于很难通过实验检测出来,但是一旦我的程序崩溃,它就会变成蓝色的月亮。
我什至不觉得那个帖子上的各种评论者是否真的同意了
for obj in list(ws):
...
Run Code Online (Sandbox Code Playgroud)
可以,但是他们似乎都以为list(ws)自己可以一直运行而不会崩溃,我什至不敢相信。list构造函数是否避免以某种方式使用迭代器,从而不关心集合大小的变化?是否可以在list构造函数期间不进行垃圾回收,因为它list是内置的?
就目前而言,我写我的代码,以破坏性pop的物品出来的WeakSet,从而完全避免迭代器。我不介意破坏性地这样做,因为在我的代码中,WeakSet无论如何我已经完成了。但是我不知道自己是否偏执。