gpt4 book ai didi

c++ - 涉及 SFINAE 的重载 C++ 模板函数的地址

转载 作者:行者123 更新时间:2023-11-30 01:34:26 27 4
gpt4 key购买 nike

我需要获取涉及 SFINAE 的重载模板函数的地址。这种情况的一个很好的例子是在这里找到的 boost::asio::spawn...

https://www.boost.org/doc/libs/1_70_0/doc/html/boost_asio/reference/spawn.html

我如何找到这个特定实例的地址...

template<
typename Function,
typename Executor>
void spawn(
const Executor & ex,
Function && function,
const boost::coroutines::attributes & attributes = boost::coroutines::attributes(),
typename enable_if< is_executor< Executor >::value >::type* = 0);

我试过这个没有成功......

using Exec = boost::asio::io_context;
using Func = std::function<void(boost::asio::yield_context)>;
void (*addr)(Exec, Func) = boost::asio::spawn;

最佳答案

boost::asio::spawn不是函数。它是一个函数模板。它是可以创建函数的蓝图。无法获得指向函数模板的指针,因为它是一个纯粹的编译时构造。

boost::asio::spawn<Func, Exec>是一个函数重载集,但它没有匹配签名 void(Exec,Func) 的重载.请记住,默认函数参数只是语法糖。这些参数仍然是函数签名的一部分。

这两个问题导致指向 boost::asio::spawn 的指针又硬又丑。使用 lambda 会容易得多。 lambda 可以让您保留类型推导并利用默认参数:

auto func = [](auto&& exec, auto&& func) {
boost::asio::spawn(std::froward<decltype(exec)>(exec),
std::forward<decltype(func)>(func));
};

即使您绝对需要一个函数指针,lambda 仍然是可行的方法。您失去了参数类型推导,但仍然可以利用函数的默认参数:

void(*addr)(const Exec&, Func) = [](const Exec& exec, Func func) {
boost::asio::spawn(exec, std::move(func));
};

之所以可行,是因为可以将无捕获的 lambda 转换为原始函数指针。

如果你真的,绝对需要一个直接指向 spawn 之一的指针由于某种原因的实例化,你可以得到它,但它并不漂亮:

using Exec = boost::asio::io_context::executor_type;
using Func = std::function<void(boost::asio::yield_context)>;

void(*addr)(const Exec&, Func&, const boost::coroutines::attributes&, void*) = boost::asio::spawn<Func&, Exec>;

虽然这样做你会损失很多。你不仅失去了参数类型推导和默认参数,你也失去了将左值和右值传递给函数的能力,因为你不再有一个推导的上下文来转发引用。我必须得到一个指向接受函数左值引用的实例化。如果您希望它接受右值引用,请使用

void(*addr)(const Exec&, Func&&, const boost::coroutines::attributes&, void*) = boost::asio::spawn<Func, Exec>;

另请注意,此函数有四个参数。称它为,即

addr(my_io_context.get_executor(), my_function, boost::coroutines::attributes{}, nullptr);

Example

关于c++ - 涉及 SFINAE 的重载 C++ 模板函数的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56437633/

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