我编写了一个traits类,它允许我在C++ 0x中提取有关函数或函数对象的参数和类型的信息(使用gcc 4.5.0测试).一般情况处理函数对象:
template <typename F>
struct function_traits {
template <typename R, typename... A>
struct _internal { };
template <typename R, typename... A>
struct _internal<R (F::*)(A...)> {
// ...
};
typedef typename _internal<decltype(&F::operator())>::<<nested types go here>>;
};
Run Code Online (Sandbox Code Playgroud)
然后我对全局范围内的普通函数进行了专门化:
template <typename R, typename... A>
struct function_traits<R (*)(A...)> {
// ...
};
Run Code Online (Sandbox Code Playgroud)
这工作正常,我可以将一个函数传递给模板或函数对象,它可以正常工作:
template <typename F>
void foo(F f) {
typename function_traits<F>::whatever ...;
}
int f(int x) { ... }
foo(f);
Run Code Online (Sandbox Code Playgroud)
如果foo我不想传递一个函数或函数对象,而是想传递一个lambda表达式,该怎么办?
foo([](int x) { ... });
Run Code Online (Sandbox Code Playgroud)
这里的问题是既不function_traits<>适用专业化.C++ …
我正在尝试使用QtConcurrent::mapped到QVector<QString>. 我已经尝试了很多方法,但似乎总是存在重载的问题。
QVector<QString> words = {"one", "two", "three", "four"};\n\nusing StrDouble = std::pair<QString, double>;\n\nQFuture<StrDouble> result = QtConcurrent::mapped<StrDouble>(words, [](const QString& word) -> StrDouble {\n return std::make_pair(word + word, 10);\n});\nRun Code Online (Sandbox Code Playgroud)\n\n该片段返回以下错误:
\n\n/home/lhahn/dev/cpp/TestLambdaConcurrent/mainwindow.cpp:23: error: no matching function for call to \xe2\x80\x98mapped(QVector<QString>&, MainWindow::MainWindow(QWidget*)::<lambda(const QString&)>)\xe2\x80\x99\n });\n ^\nRun Code Online (Sandbox Code Playgroud)\n\n我看到这篇文章,它说 Qt 找不到 lambda 的返回值,所以你必须使用std::bind它。如果我尝试这个:
using StrDouble = std::pair<QString, double>;\nusing std::placeholders::_1;\n\nauto map_fn = [](const QString& word) -> StrDouble {\n return std::make_pair(word + word, 10.0);\n};\n\nauto wrapper_map_fn = …Run Code Online (Sandbox Code Playgroud)