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

Function object to pass std::get around as an argument to functions

我的意图是为任何 std::get 的第 N 元素写一个 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); };
};

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

我认为模板化的 lambda 可能有用,但它们不能,因为它们 class 带有模板化的 operator() 就像通用的非模板 lambda 一样(唯一的区别是与前者我们可以让参数的类型是模板参数的非恒等函数)。

相反,为了使 std::invoke(getNth<1>, whatever); 有意义,我认为 getNth 不应该是模板函数,也不应该是模板 class,而是其他东西...在 > 结束后加上括号,就像 variable templates.

一样

但是,根据 this page 顶部的要点,我可能正在寻找语法根本无法提供的内容。是这样吗?

which doesn't take parenthesis after the closing >, as it happens for variable templates.

没错,变量模板就是你想要的:

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

Demo