C++ 实例化重载函数模板
我在使用C++ 实例化重载函数模板,c++,templates,c++11,C++,Templates,C++11,我在使用std::cref时遇到了这个问题。最简单的例子如下所示: template<typename Fn, typename T> auto apply(Fn f, const T &t) -> decltype(f(t)) { return f(t); } int n = 123; apply(std::cref<int>, n); // <- compile error: can't infer type `Fn` apply([]
std::cref
时遇到了这个问题。最简单的例子如下所示:
template<typename Fn, typename T>
auto apply(Fn f, const T &t) -> decltype(f(t))
{
return f(t);
}
int n = 123;
apply(std::cref<int>, n); // <- compile error: can't infer type `Fn`
apply([](const int &x) { return std::cref(x); }, n); // ok
模板
自动应用(Fn f,const T&T)->decltype(f(T))
{
返回f(t);
}
int n=123;
应用(标准::cref,n);// 问题是它有几种形式。因此,当您编写cref
时,还不清楚您指的是以下哪一项:
reference_wrapper<const int> cref (const int& elem)
reference_wrapper<const int> cref (reference_wrapper<int>& x)
在这种情况下,您的apply
功能似乎有些多余。为什么不砍掉中间人
#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>
int main() {
std::vector<int> v(10);
std::vector<std::reference_wrapper<const int>> v2;
std::transform(v.begin(), v.end(), std::back_inserter(v2),
static_cast<std::reference_wrapper<const int>(*)(const int&)>(&std::cref<int>));
}
#包括
#包括
#包括
#包括
int main(){
std::向量v(10);
std::向量v2;
std::transform(v.begin()、v.end()、std::back_插入器(v2),
静态(标准:cref);
}
应用(静态演员表(&std::cref),n)代码>,但是lambda有什么问题吗?@PiotrSkotnicki我试图做一些类似于fmap(std::cref,foos)
的事情来将std::vector
转换成std::vector
,如果没有lambda,语法看起来会更清晰。但这可能是不可能的!您可以添加自己的引用包装函数,并使用fmap(mycref,foos)
设计apply
函数来简化实际代码。在实际情况中,它实际上类似于std::transform
。
#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>
int main() {
std::vector<int> v(10);
std::vector<std::reference_wrapper<const int>> v2;
std::transform(v.begin(), v.end(), std::back_inserter(v2),
static_cast<std::reference_wrapper<const int>(*)(const int&)>(&std::cref<int>));
}