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
。您可能想要我们还没有的概念:/