gpt4 book ai didi

c++ - 从构造函数参数的组合生成变量类型的对象

转载 作者:IT老高 更新时间:2023-10-28 23:17:54 25 4
gpt4 key购买 nike

假设我有类型 A , B与构造函数 A(int a, double b, std::string c) , B(double a, int b) .

我知道如何定义一个实例化 A 的函数。或 B通过可变参数模板。

有没有办法为类型 T 设计函数/宏/类型以及 T 的一系列可能性 vector 的构造函数参数它为我提供了所有可能的对象?

例如,如果我将这个神奇的构造用于 <A, {2, 5, 6}, {2.44, 3.14}, {"yes", "no"}>它应该提供对象:

A(2, 2.44, "yes")
A(2, 2.44, "no")
A(2, 3.14, "yes")
...
A(6, 3.14, "no")

同样适用于 B或任何其他类型,而无需重新制作魔法构造。

例如,这在 Python 中非常简单,但我不知道在 C++ 中是否可行。

最佳答案

这里使用 std::experimental::array_view为了效率。您可以将其替换为 std::vector以一定的运行时成本,或以一定的清晰度成本一对迭代器/指针。

template<class T>
using array_view = std::experimental::array_view<T>;

using indexes = array_view<std::size_t>;

这会迭代每个元素的叉积 <索引中的相应索引。所以{3,3,2}作为 is迭代 {0,0,0}然后 {0,0,1}一路到{2,2,1} .

template<class F>
void for_each_cartesian_product(
indexes is,
F&& f,
std::vector<std::size_t>& result
) {
if (is.empty()) {
f(result);
return;
}
auto max_index = is.front();
for (std::size_t i = 0; i < max_index; ++i) {
result.push_back(i);
for_each_cartesian_product( {is.begin()+1, is.end()}, f, result );
result.pop_back();
}
}
template<class F>
void for_each_cartesian_product(
indexes is,
F&& f
) {
std::vector<size_t> buffer;
for_each_cartesian_product( is, f, buffer );
}

然后我们只填充我们的索引:

template<class...Ts>
std::vector<std::size_t> get_indexes( std::vector<Ts> const&... vs ) {
return {vs.size()...};
}

接下来,我们只需要获取我们的参数,将它们放入一个 vector 中,然后使用索引从每个 vector 中获取元素并将它们传递给 A待建。

template<class T, std::size_t...Is, class...Args>
std::vector<T> make_stuff( std::index_sequence<Is...>, std::vector<Args>const&... args ) {
std::vector<T> retval;
for_each_cartesian_product(
get_indexes(args...),
[&](auto&& index){
retval.emplace_back( args[ index[Is] ]... );
}
);
return retval;
}
template<class T, class...Args>
std::vector<T> make_stuff( std::vector<Args>const&... args ) {
return make_stuff<T>( std::index_sequence_for<Args...>{}, args... );
}

鲍勃是你的叔叔。

A生成的 s 可能会被移动。

也可以在编译时使用已知数组在编译时执行此操作。

index_sequence_forindex_sequence是 C++14,但在 C++11 中很容易实现。堆栈溢出的例子很多。

以上代码尚未编译。

关于c++ - 从构造函数参数的组合生成变量类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36067669/

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