gpt4 book ai didi

c++ - 使用 std::apply 进行实验性调度

转载 作者:行者123 更新时间:2023-11-30 05:12:52 25 4
gpt4 key购买 nike

我想要一个可以接受任意数量参数的元组的通用函数“request”。我希望“请求”函数根据参数的数量将调用分派(dispatch)给许多其他函数(当然,函数的接口(interface)必须匹配)。

我写了这段代码,但只有当我在“请求”中调用一种类型的函数时它才有效。一旦我取消注释调度机制(else -> dispatch to fun5),一切都会停止编译。

问题是函数'request'的主体,为分派(dispatch)到带有两个参数的函数的情况而创建,必须编译,然后里面有一个有5个参数的函数,2个参数的元组不能被应用。反之亦然。模板的经典问题。我知道我可以以某种方式将 SFINAE 概念应用到这个问题,但我不知道如何(我在 MPL 编程方面不那么强)。

#include <iostream>
#include <experimental/tuple>

enum class type { v2, v5 };

void fun2(int i1, int i2)
{
std::cout << "fun2 called, i1 = " << i1 << ", i2 = " << i2 << std::endl;
}

void fun5(bool b1, float f1, int i, char c, bool b2)
{
std::cout << "fun5 called with: " << std::boolalpha << b1 << ", " << f1 << ", " << i << ", " << c << ", " << b2 << std::endl;
}

template <typename F, typename... T>
void dispatch(F f, T... args)
{
std::experimental::apply(f, args...);
}

template <typename... T>
void request(type t, T... args)
{
if (t == type::v2)
dispatch(fun2, args...);
// else
// dispatch(fun5, args...);
}

int main()
{
auto v2 = std::make_tuple(1,1);
request(type::v2, v2);

// auto v5 = std::make_tuple(true, 1.5f, 3, 'c', false);
// request(type::v5, v5);
}

我怎样才能使这项工作?我需要什么样的调度机制才能完成这项工作?

最佳答案

我建议您不要使用枚举来选择要做什么,而是使用标签 和标签结构。然后,您可以使用简单的函数重载来简单地选择正确的 dispatch 函数。

也许是这样的

namespace type
{
struct v2_tag {};
struct v5_tag {};

v2_tag v2;
v5_tag v5;
}

template<typename... T>
void request(type::v2_tag, T... args)
{
dispatch(fun2, args...);
}

template<typename... T>
void request(type::v5_tag, T... args)
{
dispatch(fun5, args...);
}

其余代码保持不变。

关于c++ - 使用 std::apply 进行实验性调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44307627/

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