如何编写具有任意数量参数包的函数
How to write a function with an arbitrary number of parameter packs
我试图为我的协议实现一些通用函数,通过游戏引擎的 UDP 套接字工作(出于学习目的),当我偶然发现需要一个函数必须接受任意数量的元组时,每个元组其中可能有自己的数量不同的参数。
使用示例:
int main() {
...
socket.form_packet(std::tuple{"Hello", 1}, std::tuple{3.1415, var, 'g'});
}
我试过这种方法:
template<typename ...Values>
void form_packet(const std::tuple<Values...>& tuple)
{
handle_single_tuple(tuple);
}
template<template<typename ...> typename ...Tuple, typename ...Values>
void form_packet(const std::tuple<Values...>& tuple, const Tuple<Values...>&... tuples)
{
handle_single_tuple(tuple);
form_packet(tuples...);
}
但是这种实现仅支持任意数量的元组,其中每个元组可以具有相同类型(值...)的成员。
我想知道是否可以用 C++ 完成我想做的事情。如果是,我上面提到的代码有什么需要改进的地方?
提前致谢。
使用此类型特征检查类型是否是模板的特化
template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};
template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};
您可以将您的函数更改为只是一个普通的可变参数模板,但添加 SFINAE 以将通用类型限制为仅是 std::tuple
的特化,例如
template <typename... Tuples,
std::enable_if_t<(is_specialization<Tuples, std::tuple>::value && ...), bool> = true>
void form_packet(const Tuples...& tuples)
{
(handle_single_tuple(tuples), ...); // comma operator used to call each member in order
}
我试图为我的协议实现一些通用函数,通过游戏引擎的 UDP 套接字工作(出于学习目的),当我偶然发现需要一个函数必须接受任意数量的元组时,每个元组其中可能有自己的数量不同的参数。 使用示例:
int main() {
...
socket.form_packet(std::tuple{"Hello", 1}, std::tuple{3.1415, var, 'g'});
}
我试过这种方法:
template<typename ...Values>
void form_packet(const std::tuple<Values...>& tuple)
{
handle_single_tuple(tuple);
}
template<template<typename ...> typename ...Tuple, typename ...Values>
void form_packet(const std::tuple<Values...>& tuple, const Tuple<Values...>&... tuples)
{
handle_single_tuple(tuple);
form_packet(tuples...);
}
但是这种实现仅支持任意数量的元组,其中每个元组可以具有相同类型(值...)的成员。
我想知道是否可以用 C++ 完成我想做的事情。如果是,我上面提到的代码有什么需要改进的地方?
提前致谢。
使用此类型特征检查类型是否是模板的特化
template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};
template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};
您可以将您的函数更改为只是一个普通的可变参数模板,但添加 SFINAE 以将通用类型限制为仅是 std::tuple
的特化,例如
template <typename... Tuples,
std::enable_if_t<(is_specialization<Tuples, std::tuple>::value && ...), bool> = true>
void form_packet(const Tuples...& tuples)
{
(handle_single_tuple(tuples), ...); // comma operator used to call each member in order
}