将 std::get 作为参数传递给函数的函数对象

Enr*_*lis 2 c++ lambda function-object template-meta-programming c++20

我的目的是为N任何std::get可以作为参数的第 th 元素编写一个 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); };
};
Run Code Online (Sandbox Code Playgroud)

是否可以避免使用两个括号?

我认为模板化的 lambdas 可能有用,但它们不能,因为它们是具有模板化的类,operator()就像通用的非模板化 lambdas 一样(唯一的区别在于前者我们可以让参数的类型成为模板参数)。

相反,为了std::invoke(getNth<1>, whatever);有意义,我认为getNth不应该是模板函数,也不应该是模板类,而是其他东西......在结束后不带括号>,就像变量 templates发生的那样。

但是,根据本页顶部的要点,我可能正在寻找语法根本不提供的内容。是这种情况吗?

eca*_*mur 5

关闭后不带括号>,因为它发生在变量模板中。

确切地说,变量模板正是您想要的:

#include <functional>
#include <tuple>

template<int N>
auto getNth = [](auto const& x){ return std::get<N>(x); };

int main() {
    auto whatever = std::tuple{1, 2, 3};
    return std::invoke(getNth<1>, whatever);
}
Run Code Online (Sandbox Code Playgroud)

演示