gpt4 book ai didi

c++ - 使用自动说明符获取 lambda 的参数类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:00 28 4
gpt4 key购买 nike

我有一个元函数,它给出了 lambda/函数的第 I 参数的类型:

#include <iostream>
#include <tuple>

namespace details
{
//! Spezialization for Funktion-Pointers
template<typename Ret, typename... Args>
std::tuple<Args...> getArgs(Ret (*)(Args...));

//! Spezialization for Functor/Lambdas
template<typename F, typename Ret, typename... Args>
std::tuple<Args...> getArgs(Ret (F::*)(Args...));

//! Spezialization for Functor/Lambdas
template<typename F, typename Ret, typename... Args>
std::tuple<Args...> getArgs(Ret (F::*)(Args...) const);

}; // namespace details

template<typename F, std::size_t I>
using GetArg = std::tuple_element_t<I, decltype(details::getArgs(std::declval<F>()))>;

int main()
{
auto f1 = [](int a, int b){};
static_assert(std::is_same<GetArg<decltype(f1), 0>, int>{}, "Not the same!");

// auto f2 = [](int a, auto b){};
// static_assert(std::is_same<GetArg<decltype(f2), 0>, int>{}, "Not the same!");
}

Live

带有 auto 说明符的第二个 lambda 不编译,因为我的特化不匹配,因为 auto 就像模板参数 T,它不知道。有没有办法让 f2 也能做到这一点?

由于 lambda 是不透明类型,模板函数没有类型,除非用模板参数类型实例化,我真的不知道如何让它工作?不可能吗?

最佳答案

Is there a way of making this work for f2 as well?

没有,据我所知。

您可以将通用的 lambda(具有一个或多个 auto 参数的 lambda)视为一个模板函数(包装在一个类中)。

除去类包装,可以看到

[](int a, auto b){};

几乎一样

template <typename T>
void foo (int a, T b)
{ };

你无法推断出 b 的类型从 lambda 中完全可以推断出 b 的类型来自 foo() : 它决定调用函数(从参数中推导出类型)或解释它(类似于 foo<int> )。

但是如果你简单地写decltype(foo) , 编译器无法决定哪种类型是 T所以报错。

无论如何,我在编译时也遇到了错误

static_assert(std::is_same<GetArg<decltype(f1), 0>, int>{}, "Not the same!");

我想你必须写 GetArg如下

using GetArg = std::tuple_element_t<I, decltype(details::getArgs(&F::operator()))>;
// ..............................................................^^^^^^^^^^^^^^

或者您可以维护您的实际 GetArg但用 +f1 调用它

static_assert(std::is_same<GetArg<decltype(+f1), 0>, int>{}, "Not the same!");
// ........................................^^^

即:将 lambda 转换为函数指针。

关于c++ - 使用自动说明符获取 lambda 的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55649942/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com