相关疑难解决方法(0)

在C++ 0x中专门研究lambda上的模板

我编写了一个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++ …

c++ lambda templates specialization c++11

25
推荐指数
2
解决办法
7811
查看次数

使 QtConcurrent::mapped 与 lambda 一起工作

我正在尝试使用QtConcurrent::mappedQVector<QString>. 我已经尝试了很多方法,但似乎总是存在重载的问题。

\n\n
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});\n
Run 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  ^\n
Run Code Online (Sandbox Code Playgroud)\n\n

我看到这篇文章,它说 Qt 找不到 lambda 的返回值,所以你必须使用std::bind它。如果我尝试这个:

\n\n
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)

c++ qt c++11

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

标签 统计

c++ ×2

c++11 ×2

lambda ×1

qt ×1

specialization ×1

templates ×1