基于未知数量的参数返回 N 元组的 Variadic 模板
Variadic template returning a N-tuple based on an unknown number of arguments
我想要一个可变参数函数模板,它接受某种类型 T 的指针,填充这些指针,并为它们中的每一个生成一个对象作为结果,最终结果是所有这些生成的对象的元组.
给定库中的函数(使用 C api):
struct opaque {};
bool fill_pointer(opaque **);
并且:
struct MyType {};
MyType gen_object(opaque *);
我想要一个可变参数模板函数,看起来像这样(有点):
std::tuple<bool, MyType...> fill_and_gen_objects(opaque **...);
(其中 bool
结果是 false
如果且只有 fill_pointer
return 值之一是 false
)。
这是我想要实现的:
opaque *oa, *ob, *oc;
auto [failed, ta, tb, tc] = fill_and_gen_objects(oa, ob, oc);
谢谢
那是很重的伪代码,我会用很重的伪代码来回答:
template<typename ... Ts>
constexpr auto fill_and_gen_objects(Ts* ... os)
{
bool some_status = true; //whatever
return std::make_tuple(some_status, gen_object(os) ...);
}
好的,实际上它甚至可以编译,参见here
编辑:降级到 C++14 ...这就是您标记的内容。
C++17 相同,使用 CTAD
template<typename ... Ts>
constexpr auto fill_and_gen_objects(Ts* ... os)
{
bool some_status = true; //whatever
return std::tuple{some_status, gen_object(os) ...};
}
使用缩写函数模板语法的 C++20 相同
constexpr auto fill_and_gen_objects(auto* ... os)
{
bool some_status = true; //whatever
return std::tuple{some_status, gen_object(os) ...};
}
C++20 使用整数序列索引(未测试):
constexpr auto fill_and_gen_objects(auto* ... os)
{
bool some_status = true; //whatever
return []<int ... I>(std::index_sequence<I...>, auto tup){ return std::tuple{some_status, gen_object(std::get<I>(tup)) ...};}
(std::make_index_sequence<sizeof...(os)>{}, std::tuple{os...})
}
此外,这里是 C++27 解决方案:
void do_my_fckng_work() { bool asap = true; }
我想要一个可变参数函数模板,它接受某种类型 T 的指针,填充这些指针,并为它们中的每一个生成一个对象作为结果,最终结果是所有这些生成的对象的元组.
给定库中的函数(使用 C api):
struct opaque {};
bool fill_pointer(opaque **);
并且:
struct MyType {};
MyType gen_object(opaque *);
我想要一个可变参数模板函数,看起来像这样(有点):
std::tuple<bool, MyType...> fill_and_gen_objects(opaque **...);
(其中 bool
结果是 false
如果且只有 fill_pointer
return 值之一是 false
)。
这是我想要实现的:
opaque *oa, *ob, *oc;
auto [failed, ta, tb, tc] = fill_and_gen_objects(oa, ob, oc);
谢谢
那是很重的伪代码,我会用很重的伪代码来回答:
template<typename ... Ts>
constexpr auto fill_and_gen_objects(Ts* ... os)
{
bool some_status = true; //whatever
return std::make_tuple(some_status, gen_object(os) ...);
}
好的,实际上它甚至可以编译,参见here
编辑:降级到 C++14 ...这就是您标记的内容。
C++17 相同,使用 CTAD
template<typename ... Ts>
constexpr auto fill_and_gen_objects(Ts* ... os)
{
bool some_status = true; //whatever
return std::tuple{some_status, gen_object(os) ...};
}
使用缩写函数模板语法的 C++20 相同
constexpr auto fill_and_gen_objects(auto* ... os)
{
bool some_status = true; //whatever
return std::tuple{some_status, gen_object(os) ...};
}
C++20 使用整数序列索引(未测试):
constexpr auto fill_and_gen_objects(auto* ... os)
{
bool some_status = true; //whatever
return []<int ... I>(std::index_sequence<I...>, auto tup){ return std::tuple{some_status, gen_object(std::get<I>(tup)) ...};}
(std::make_index_sequence<sizeof...(os)>{}, std::tuple{os...})
}
此外,这里是 C++27 解决方案:
void do_my_fckng_work() { bool asap = true; }