基于未知数量的参数返回 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; }