gpt4 book ai didi

c++ - 推断 "make_function"的 lambda 或任意可调用对象的调用签名

转载 作者:IT老高 更新时间:2023-10-28 12:53:59 30 4
gpt4 key购买 nike

在某些情况下,希望能够对可调用对象进行类型删除(例如,函数、函数指针、带有 operator() 的对象实例、lambda、mem_fn),例如在 Using Boost adaptors with C++11 lambdas 中。其中需要可复制且可默认构造的类型。

std::function将是理想的,但似乎没有办法自动确定实例化类模板的签名std::function和。是否有一种简单的方法来获取任意可调用的函数签名和/或将其包装在适当的 std::function 中实例化实例(即 make_function 函数模板)?

具体来说,我正在寻找一个或另一个

template<typename F> using get_signature = ...;
template<typename F> std::function<get_signature<F>> make_function(F &&f) { ... }

这样 make_function([](int i) { return 0; })返回 std::function<int(int)> .显然,如果一个实例可以通过多个签名调用(例如,具有多个签名的对象、模板或默认参数 operator() s),这显然不会起作用。

Boost 很好,尽管不太复杂的非 Boost 解决方案是首选。


编辑:回答我自己的问题。

最佳答案

我想出了一个相当讨厌的非库解决方案,利用 lambda 具有 operator() 的事实:

template<typename T> struct remove_class { };
template<typename C, typename R, typename... A>
struct remove_class<R(C::*)(A...)> { using type = R(A...); };
template<typename C, typename R, typename... A>
struct remove_class<R(C::*)(A...) const> { using type = R(A...); };
template<typename C, typename R, typename... A>
struct remove_class<R(C::*)(A...) volatile> { using type = R(A...); };
template<typename C, typename R, typename... A>
struct remove_class<R(C::*)(A...) const volatile> { using type = R(A...); };

template<typename T>
struct get_signature_impl { using type = typename remove_class<
decltype(&std::remove_reference<T>::type::operator())>::type; };
template<typename R, typename... A>
struct get_signature_impl<R(A...)> { using type = R(A...); };
template<typename R, typename... A>
struct get_signature_impl<R(&)(A...)> { using type = R(A...); };
template<typename R, typename... A>
struct get_signature_impl<R(*)(A...)> { using type = R(A...); };
template<typename T> using get_signature = typename get_signature_impl<T>::type;

template<typename F> using make_function_type = std::function<get_signature<F>>;
template<typename F> make_function_type<F> make_function(F &&f) {
return make_function_type<F>(std::forward<F>(f)); }

有什么可以简化或改进的想法吗?有什么明显的错误吗?

关于c++ - 推断 "make_function"的 lambda 或任意可调用对象的调用签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11893141/

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