C++ 将函数模板转换为模板函子

C++ 将函数模板转换为模板函子,c++,c++11,functor,C++,C++11,Functor,我想知道是否有可能从函数模板创建函数对象。以下Functor结构从函数创建函数对象: #包括 模板 结构函子{ 模板 auto operator()(Ar&&…rg)->decltype(f(std::forward)C++14中的通用lambda表达式正在被转换为类似于我所追求的函数: 例如,此通用lambda表达式包含以下语句: auto L = [](const auto& x, auto& y){ return x + y; }; 可能会导致创建闭包类型和行为类似于以

我想知道是否有可能从函数模板创建函数对象。以下
Functor
结构从函数创建函数对象:

#包括
模板
结构函子{
模板
auto operator()(Ar&&…rg)->decltype(f(std::forward)C++14中的通用lambda表达式正在被转换为类似于我所追求的函数:

例如,此通用lambda表达式包含以下语句:

 auto L = [](const auto& x, auto& y){ return x + y; };
可能会导致创建闭包类型和行为类似于以下结构的对象:

struct {
  template <typename T, typename U>
  auto operator()(const T& x, U& y) const { return x + y; }
} L;
struct{
模板
自动运算符()(常量T&x,U&y)常量{返回x+y;}
}L;

因此,我天真地希望可能存在一些使我所追求的成为可能的工具。但我仅限于C++11。

不,这是不可能的。模板名称本身可以以非常有限的方式使用。在传递之前,必须将其包装在类中。在C++14中,使用lambda包装对函数的调用似乎是最简单的方法。然后你可以用很多方法:

auto wrapper = [](const auto& x){ return plus_one(x); }

std::cout << wrapper(42) << "\n";
std::cout << std::invoke(wrapper, 42) << "\n";
std::cout << std::bind(wrapper, 42)() << "\n";
// etc.
struct Wrapper {
    template <typename T>
    auto operator()(const T& x) const
    {
        return plus_one(x);
    }
};
Wrapper wrapper;
// same usage