Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++ 在std::函数中使用模板参数_C++_Templates - Fatal编程技术网

C++ 在std::函数中使用模板参数

C++ 在std::函数中使用模板参数,c++,templates,C++,Templates,我有一个模板函数,它根据调用者指定的算法选择向量或列表元素: template<typename It> void Foo(It begin, It end, std::function<It(It, It)> GetElement) { It element = GetElement(begin, end); } 但我显然被困在了论点部分,这部分用问号表示…C++11: Foo(v.begin(), v.end(), [v](decltyp

我有一个模板函数,它根据调用者指定的算法选择向量或列表元素:

template<typename It>
void Foo(It begin, It end, std::function<It(It, It)> GetElement)
{
    It element = GetElement(begin, end);
}

但我显然被困在了论点部分,这部分用问号表示…

C++11

Foo(v.begin(), 
    v.end(), 
    [v](decltype(v.begin()) a, decltype(v.begin()) b) { return v.begin(); });
Foo(v.begin(), 
    v.end(), 
    [v](auto a, auto b) { return v.begin(); });
template<typename It, typename F>
void Foo(It begin, It end, F&& GetElement)
{
    It element = GetElement(begin, end);
}

C++14

Foo(v.begin(), 
    v.end(), 
    [v](decltype(v.begin()) a, decltype(v.begin()) b) { return v.begin(); });
Foo(v.begin(), 
    v.end(), 
    [v](auto a, auto b) { return v.begin(); });
template<typename It, typename F>
void Foo(It begin, It end, F&& GetElement)
{
    It element = GetElement(begin, end);
}
如果您不关心参数
a
b
,您可以使用:
[v](自动…{return v.begin();}
,如注释中的skypjack所示


另外,我建议将lambda作为模板参数传递,除非您有充分的理由使用
std::function

Foo(v.begin(), 
    v.end(), 
    [v](decltype(v.begin()) a, decltype(v.begin()) b) { return v.begin(); });
Foo(v.begin(), 
    v.end(), 
    [v](auto a, auto b) { return v.begin(); });
template<typename It, typename F>
void Foo(It begin, It end, F&& GetElement)
{
    It element = GetElement(begin, end);
}
模板
void Foo(它开始、结束、F&&GetElement)
{
It元素=GetElement(开始、结束);
}
我写了一篇与主题相关的文章:


它包含一些基准测试,显示与模板参数和其他解决方案相比,为
std::function
生成了多少程序集。

C++11

Foo(v.begin(), 
    v.end(), 
    [v](decltype(v.begin()) a, decltype(v.begin()) b) { return v.begin(); });
Foo(v.begin(), 
    v.end(), 
    [v](auto a, auto b) { return v.begin(); });
template<typename It, typename F>
void Foo(It begin, It end, F&& GetElement)
{
    It element = GetElement(begin, end);
}

C++14

Foo(v.begin(), 
    v.end(), 
    [v](decltype(v.begin()) a, decltype(v.begin()) b) { return v.begin(); });
Foo(v.begin(), 
    v.end(), 
    [v](auto a, auto b) { return v.begin(); });
template<typename It, typename F>
void Foo(It begin, It end, F&& GetElement)
{
    It element = GetElement(begin, end);
}
如果您不关心参数
a
b
,您可以使用:
[v](自动…{return v.begin();}
,如注释中的skypjack所示


另外,我建议将lambda作为模板参数传递,除非您有充分的理由使用
std::function

Foo(v.begin(), 
    v.end(), 
    [v](decltype(v.begin()) a, decltype(v.begin()) b) { return v.begin(); });
Foo(v.begin(), 
    v.end(), 
    [v](auto a, auto b) { return v.begin(); });
template<typename It, typename F>
void Foo(It begin, It end, F&& GetElement)
{
    It element = GetElement(begin, end);
}
模板
void Foo(它开始、结束、F&&GetElement)
{
It元素=GetElement(开始、结束);
}
我写了一篇与主题相关的文章:


它包含一些基准测试,显示与模板参数和其他解决方案相比,
std::function
生成了多少程序集。

不是很好吗?无论如何,您既不使用
a
也不使用
b
。@skypjack:当然,我(可能错误地)认为
{return v.begin();}
主体只是一个占位符。我还想给出匹配这两个参数的最一般方法。我如何调用模板函数版本?@user1934212:完全相同,或者使用
std::forward(GetElement)(begin,end)对于某些纯粹主义者;-)
[v](自动…{return v.begin();}
不是很好吗?无论如何,您既不使用
a
也不使用
b
。@skypjack:当然,我(可能错误地)认为
{return v.begin();}
主体只是一个占位符。我还想给出匹配这两个参数的最一般方法。我如何调用模板函数版本?@user1934212:完全相同,或者使用
std::forward(GetElement)(begin,end)对于某些纯粹主义者;-)<代码>它
不能从lambda中推断出
std::function
。您可能想要我们还没有的概念:/
它不能从lambda中推断出
std::function
。您可能想要我们还没有的概念:/