gpt4 book ai didi

c++ - 如何从实际函数中推导出 `std::function` 参数?

转载 作者:太空狗 更新时间:2023-10-29 20:33:18 25 4
gpt4 key购买 nike

给定一个类

class Foo {
public:
std::shared_ptr<const Bar> quux(const std::string&, std::uint32_t);
}

我可以声明一个具有相同接口(interface)的 std::function:

std::function<std::shared_ptr<const Bar>(const std::string&, std::uint32_t)> baz = ...

有没有一种方法可以压缩该声明,使 std::function 的模板参数派生自该方法的声明,例如:

std::function<functype(X::quux)> baz = ...

其中 functype 是一个虚构的 C++ 运算符,类似于 decltype。有没有办法做到这一点/做 有这样的能力吗?

我确实看到该方法实际上有一个稍微不同的签名,因为它也需要一个指向 this 对象的引用/指针;我也可以导出这样的签名。

最佳答案

是的,你可以。适配How do I get the argument types of a function pointer in a variadic template class?根据您的要求,我们得到:

template<typename T> 
struct function_traits;

template<typename R, typename C, typename ...Args>
struct function_traits<R(C::*)(Args...)>
{
using type = std::function<R(Args...)>;
};

class Bar;

class Foo {
public:
std::shared_ptr<const Bar> quux(const std::string&, std::uint32_t);
};

int main()
{
std::cout << std::is_same<
std::function<std::shared_ptr<const Bar>(const std::string&, std::uint32_t)>,
function_traits<decltype(&Foo::quux)>::type>::value << std::endl;
}

要使其与常量方法一起工作,您需要另一个特化:

template<typename R, typename C, typename ...Args> 
struct function_traits<R(C::*)(Args...) const>
{
using type = std::function<R(Args...)>;
};

但是你会遇到重载方法的问题,因为为了解决重载问题,你无论如何都需要指定参数。

关于c++ - 如何从实际函数中推导出 `std::function` 参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56021945/

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