我实现了一个通用事件发射器类,它允许代码注册回调,并使用参数发出事件.我使用Boost.Any类型擦除来存储回调,以便它们可以具有任意参数签名.
这一切都有效,但由于某种原因,传入的lambdas必须首先变成std::function对象.为什么编译器不推断lambda是函数类型?是因为我使用可变参数模板的方式吗?
我使用Clang(版本字符串:) Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn).
码:
#include <functional>
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <boost/any.hpp>
using std::cout;
using std::endl;
using std::function;
using std::map;
using std::string;
using std::vector;
class emitter {
public:
template <typename... Args>
void on(string const& event_type, function<void (Args...)> const& f) {
_listeners[event_type].push_back(f);
}
template <typename... Args>
void emit(string const& event_type, Args... args) {
auto listeners = _listeners.find(event_type);
for (auto l : listeners->second) {
auto lf …Run Code Online (Sandbox Code Playgroud) 当使用term模式导数(如ansi-term或multi-term)时,我经常想选择一个区域并将其复制到其他地方。如果该区域包括一条在终端窗口边缘处换行的线,则将该区域粘贴到另一个缓冲区中时,总是在换行的位置插入一个硬换行符term。这意味着我经常不得不返回并清理粘贴的文本。有办法避免这样做吗?我都尝试term-line-mode和term-char-mode; 两者都做同样的事情。
我不想编写一个剥离所有换行符的猛勾,因为我想在原始内容中保留现有的硬换行符。
我正在尝试调试一些 C++11 代码,而 LLDB 没有帮助。代码大致如下:
void f(my_type dt) {
try {
g(h(dt));
}
catch ( /* reasonable exception type here */ ) {
}
}
Run Code Online (Sandbox Code Playgroud)
当我在该行上放置断点时g(h(dt)),LLDB 坚持认为 的值dt不可用。它肯定不能被忽略,因为它用于实现h某些数据库查询的输入。
我使用 CMake,它使用以下标志进行编译:
CXX_FLAGS = -g -O0 -fPIC -std=c++11 -stdlib=libc++ -Wall
Run Code Online (Sandbox Code Playgroud)
我确认(使用make VERBOSE=true)这些标志确实用于构建项目。据我所知,应包含完整的调试信息并关闭所有优化。事实显然并非如此。我还可以添加哪些其他标志来强制 Clang 保持所有参数和变量在整个调用堆栈中可用?
不幸的是,使用小文件和函数的小测试用例不会重现此问题:大多数时候,变量会按我的预期保留。
我正在运行 Yosemite 的 Mac 上工作。
$ clang++ --version
Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)