Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将lambda传递给模板函数_C++_Templates_Lambda - Fatal编程技术网

C++ 将lambda传递给模板函数

C++ 将lambda传递给模板函数,c++,templates,lambda,C++,Templates,Lambda,我有以下代码: template <typename L> double measure( L&& action ) { using namespace std::chrono; high_resolution_clock::time_point start, end; duration<double> timeSpan; start = high_resolution_clock::now(); action(

我有以下代码:

template <typename L>
double measure( L&& action )
{
    using namespace std::chrono;

    high_resolution_clock::time_point start, end;
    duration<double> timeSpan;

    start = high_resolution_clock::now();
    action();
    end = high_resolution_clock::now();

    timeSpan = duration_cast<milliseconds>(end - start);
    return timeSpan.count();
}
模板
双重测量(L和行动)
{
使用名称空间std::chrono;
高分辨率时钟:时间点开始、结束;
持续时间跨度;
开始=高分辨率时钟::现在();
动作();
end=高分辨率时钟::现在();
timeSpan=持续时间(结束-开始);
返回timeSpan.count();
}
我是这样用的:

    cout << measure([](){ mergeSort<float>(array, 0, 10000); }) << endl << endl;
    timer::measure<ratio<1,1000>>([](){ mergeSort<float>(array, 0, 10000); })
template <typename Ratio, typename L>
//        ^^^^^^^^^^^^^^^^
double measure( L&& action )
{
    using namespace std::chrono;

    auto start = high_resolution_clock::now();
    action();
    auto end = high_resolution_clock::now();

    auto timeSpan = duration_cast<duration<double, Ratio>>(end - start);
    //                            ^^^^^^^^^^^^^^^^^^^^^^^
    return timeSpan.count();
}

cout你可以有这样的东西:

    cout << measure([](){ mergeSort<float>(array, 0, 10000); }) << endl << endl;
    timer::measure<ratio<1,1000>>([](){ mergeSort<float>(array, 0, 10000); })
template <typename Ratio, typename L>
//        ^^^^^^^^^^^^^^^^
double measure( L&& action )
{
    using namespace std::chrono;

    auto start = high_resolution_clock::now();
    action();
    auto end = high_resolution_clock::now();

    auto timeSpan = duration_cast<duration<double, Ratio>>(end - start);
    //                            ^^^^^^^^^^^^^^^^^^^^^^^
    return timeSpan.count();
}
模板
//        ^^^^^^^^^^^^^^^^
双重测量(L和行动)
{
使用名称空间std::chrono;
自动启动=高分辨率时钟::现在();
动作();
自动结束=高分辨率时钟::现在();
自动时间跨度=持续时间(结束-开始);
//                            ^^^^^^^^^^^^^^^^^^^^^^^
返回timeSpan.count();
}

首先,传递lambda函数的标准方法是使用
std:function

#include <functional>

...

double measure( std::function<void()> action ){
    ...
}
#包括
...
双重测量(标准::功能动作){
...
}
然后用你使用的方法使用它

cout << measure([&](){ mergeSort<float>(array, 0, 10000); }) << endl << endl;

cout模板参数
std::ratio
如何在
measure
中准确使用?函数的最后第二行是
timeSpan=duration\u cast(end-start)g++在我尝试此操作时给出了一个很长的错误输出。再次尝试检查我是否键入了错误的内容,但no.g++基本上会抱怨:
注意:模板参数推断/替换失败:
@pedroverneti。如果您忘记使用
measure
更新对
measure
的调用,则听起来像是一个错误。否。事实并非如此。我完全按照我的建议键入了。@Pedroverneti您能提供一个关于此错误的说明吗?在缩短代码以向您展示的同时,我意识到
持续时间\u cast<…
中缺少了一个'>'。当你说我可能忘了更新调用时,我只检查了调用.“标准”即存储lambda函数的推荐方法是
std::function
。相反,在传递时,在接收端使用函数模板更为优越,因为这样做可以避免增加
std::function
。。。它本身就是一个模板,但是有一堆额外的膨胀来启用类型擦除,在本例中不需要这样做。看见