我了解到nullptr,除了可转换为任何指针类型(但不是任何整数类型)之外,还有自己的类型std::nullptr_t.因此可以接受一个方法重载std::nullptr_t.
究竟为什么需要这样的过载?
如何比较C++中的两个lambda函数(Visual Studio 2010)?
std::function<void ()> lambda1 = []() {};
std::function<void ()> lambda2 = []() {};
bool eq1 = (lambda1 == lambda1);
bool eq2 = (lambda1 != lambda2);
Run Code Online (Sandbox Code Playgroud)
我收到一个编译错误,声称operator ==无法访问.
编辑:我正在尝试比较函数实例.所以lambda1 == lambda1应该返回true,而lambda1 == lambda2应该返回false.
问题严格关注std::function而非关键boost::function.有关详细信息,请参阅此问题底部的" 更新"部分,尤其是有关无法std::function根据C++ 11标准比较非空对象的部分.
C++ 11 std::function类模板非常适合维护一组回调.vector例如,可以将它们存储在a中,并在需要时调用它们.但是,维护这些对象并允许取消注册似乎是不可能的.
让我具体一点,想象一下这堂课:
class Invoker
{
public:
void Register(std::function<void()> f);
void Unregister(std::function<void()> f);
void InvokeAll();
private:
// Some container that holds the function objects passed to Register()
};
Run Code Online (Sandbox Code Playgroud)
示例使用场景:
void foo()
{
}
int main()
{
std::function<void()> f1{foo};
std::function<void()> f2{[] {std::cout << "Hello\n";} };
Invoker inv;
// The easy part
// Register callbacks
inv.Register(f1);
inv.Register(f2);
// Invoke them
inv.InvokeAll();
// The seemingly impossible part. How can …Run Code Online (Sandbox Code Playgroud) void ff(int){}
void Unscribe(const boost::function<void(int)>& f)
{
std::map<int, boost::function<void(int)> > map;
map[0] = ff;
if( map[0] == f)
{
}
}
Unscribe( ff );
Run Code Online (Sandbox Code Playgroud)
我希望能够将两个boost :: function与相同的签名进行比较.我应该修改什么才能使这段代码可编辑?
我有一个KeyCallbacks 的向量:
typedef boost::function<void (const KeyEvent&)> KeyCallback
Run Code Online (Sandbox Code Playgroud)
我用它来存储按下键盘按钮时的所有监听器.我可以添加它们并将事件发送到所有回调for_each,但我不知道如何KeyCallback从我的向量中删除特定的签名.
例如,我想要这样的东西:
void InputManager::UnregisterCallback(KeyCallback callback) {
mKeyCallbacks.erase(std::find(mKeyCallbacks.begin(), mKeyCallbacks.end(), callback));
}
Run Code Online (Sandbox Code Playgroud)
根据boost::function文档(见这里),没有比较函数对象的东西,这可以解释我上面的问题.我被困了吗?这有什么好办法吗?
(我读到boost::signals了回调机制,但它显然很慢,我希望回调可能会在一帧内被解雇几次.)