【发布时间】:2021-03-20 03:02:47
【问题描述】:
我的意图是为std::get 的任何Nth 元素编写一个getter,一旦它被特定的N 实例化,它就可以作为参数。
换句话说,std::get<N> 不能被传递,因为它不是一个函数对象,而是一个根据它所接受的参数类型模板化的函数。
是否可以定义一个对象getNth 使得std::invoke(getNth<1>, whatever); 有意义并且实际上等效于getNth<1>(whatever)?
我最多可以使用std::invoke(getNth<1>(), whatever);,通过这种方式定义getNth:
template<int N>
auto getNth() {
return [](auto const& x){ return std::get<N>(x); };
};
是否可以避免使用两个括号?
我认为模板化 lambdas 可能有用,但它们不能,因为它们是具有模板化 operator() 的类,就像通用非模板化 lambdas 一样(唯一的区别在于,我们可以将参数的类型设为模板参数的非恒等函数)。
相反,为了使std::invoke(getNth<1>, whatever); 有意义,我认为getNth 不应该是模板函数,也不应该是模板类,而是其他东西......在结束> 之后不带括号,如它发生在variable templates。
但是,根据this page 顶部的要点,我可能正在寻找语法根本不提供的东西。是这样吗?
【问题讨论】:
标签: c++ lambda template-meta-programming c++20 function-object