gpt4 book ai didi

c++ - 使用来自可变参数模板类的特定参数调用函数

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

template< typename ... Args >
class Message {
public:
Message( Args&& ... args ) {
mArgs = std::make_tuple( args ... );
}

std::tuple< Args ... > mArgs;
typedef std::function< void ( Args ... ) > HandlerType;

void Consume( HandlerType handler ) {
// handler( mArgs );
// How does one unpack this?
}
};

// Testing code
Message<int, int> msg(1, 2);

msg.Consume( [] ( int i, int j ) {
std::cout << i << ',' << j << '\n';
});

我正在尝试一个简单的消息传递 API,试图为消息和参数提供一个简单的模板化接口(interface)。当我想将参数传递给函数时遇到问题。

我没有太多地使用可变参数模板,想知道是否有一个优雅的解决方案来解决我的问题。

最佳答案

这是一个简单的框架,用于解包元组并将其元素作为给定函数的参数提供:

namespace detail
{
template<int... Is>
struct seq { };

template<int N, int... Is>
struct gen_seq : gen_seq<N - 1, N - 1, Is...> { };

template<int... Is>
struct gen_seq<0, Is...> : seq<Is...> { };

template<typename F, typename... Ts, int... Is>
void call_with_tuple(F&& f, std::tuple<Ts...> const& t, seq<Is...>)
{
(std::forward<F>(f))(std::get<Is>(t)...);
}
}

template<typename F, typename... Ts>
void call_with_tuple(F&& f, std::tuple<Ts...> const& t)
{
detail::call_with_tuple(std::forward<F>(f), t,
detail::gen_seq<sizeof...(Ts)>());
}

在您的 Consume() 函数中,您可以执行以下操作:

call_with_tuple(handler, mArgs);

更多上下文:

#include <iostream>
#include <functional>

template< typename ... Args >
class Message {
public:
Message( Args&& ... args ) {
mArgs = std::make_tuple( args ... );
}

std::tuple< Args ... > mArgs;
typedef std::function< void ( Args ... ) > HandlerType;

void Consume( HandlerType handler ) {
call_with_tuple(handler, mArgs);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
};

这是一个 live example .

关于c++ - 使用来自可变参数模板类的特定参数调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16824740/

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