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>));
}