将相同的功能应用于不同大小的N数组的每个元素
Apply same function to each element of N arrays of different sizes
让我们考虑使用构造函数和成员函数foo
实现的类A
。
这是一些代码:
constexpr int size1 = 100;
constexpr int size2 = 13;
constexpr int size3 = 48;
constexpr int size4 = 231;
constexpr int size5 = 5;
constexpr int size6 = 125;
constexpr int size7 = 88;
constexpr int size8 = 549;
constexpr int size9 = 417;
int main(void)
{
std::array<A*, size1> array1;
std::array<A*, size2> array2;
std::array<A*, size3> array3;
std::array<A*, size4> array4;
std::array<A*, size5> array5;
std::array<A*, size6> array6;
std::array<A*, size7> array7;
std::array<A*, size8> array8;
std::array<A*, size9> array9;
// Solution
return 0;
}
我想构造每个数组的每个元素,然后为每个数组调用成员函数foo
。
基本上,我想做:
for (auto& element : array1)
{
element = new A();
element->foo();
}
对于每个数组。
最短,最简单的方法是什么,而无需连续写下九个横环?
您很可能希望将代码打包到特定的初始化功能中。由于(std::
)不同长度的数组实际上是不同的类型,但是您要么需要模板功能,要么需要在数组的内部原始数组(data()
)上操作:
template <typename T>
void initialize(T& t)
{
for(auto& a : t)
// ^ reference to pointer (!)
{
a = new A();
a->foo();
}
std::cout << std::endl;
}
您只需在每个数组上调用此功能即可。如果还不够短,则可以将其包装到variadic模板函数中:
template <typename T, typename ... TT>
void initialize(T& t, TT& ... tt)
{
initialize(t);
initialize(tt...);
}
// alternatively, a bit shorter, with C++17 fold expression:
template <typename ... TT>
void initialize(TT& ... tt)
{
(initialize(tt), ...);
}
在呼叫点,这很可能是您可以得到的最短(除了选择一个较短的名称外):
initialize(array1, array2, array3, array4, ...);
您可能会做类似:
的事情template <std::size_t N>
using As = std::array<A*, N>;
std::tuple<As<size1>, As<size2>, As<size3>, As<size4>, As<size5>,
As<size6>, As<size7>, As<size8>, As<size9>> arrays;
std::apply([](auto& ...as)
{
auto l = [](auto& a)
{
for (auto& element : a)
{
element = new A();
element->foo();
}
};
(l(as), ...);
}, arrays);
甚至更简单:
template <size_t N>
std::array<A*, N> MakeAs()
{
std::array<A*, N> res;
for (auto& element : res)
{
element = new A();
element->foo();
}
return res;
}
和
auto array1 = MakeAs<size1>();
auto array2 = MakeAs<size2>();
auto array3 = MakeAs<size3>();
auto array4 = MakeAs<size4>();
auto array5 = MakeAs<size5>();
auto array6 = MakeAs<size6>();
auto array7 = MakeAs<size7>();
auto array8 = MakeAs<size8>();
auto array9 = MakeAs<size9>();
//C++ 11 SFINAE fold
template<size_t I = 0, typename F, typename ...Ts>
typename std::enable_if<I == sizeof...(Ts)>::type //I == end
for_each(std::tuple<Ts...>&, const F&) {}
template<size_t I = 0, typename F, typename ...Ts>
typename std::enable_if<I < sizeof...(Ts)>::type //I < end
for_each(std::tuple<Ts...>& tuple, const F& function)
{
function(std::get<I>(tuple));
for_each<I + 1>(tuple, function);
}
//C++ 17
template<size_t I = 0, typename F, typename ...Ts>
void for_each(std::tuple<Ts...>& tuple, const F& function)
{
if constexpr(I < sizeof...(Ts))
{
function(std::get<I>(tuple));
for_each<I + 1>(tuple, function);
}
}
//Client
for_each(std::tie(array1, array2, array3, array4, array5, array6, array7, array8, array9),
[](auto& array)
{
for(auto* element : array)
{
element = new A();
element->foo();
}
});
相关文章:
- 数组元素打印的递归方法
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 为什么使用数组元素查找最大数字的程序不起作用?
- 数组元素更改值?
- 如何访问宏中定义的数组元素
- 将数组元素递增 1
- C++函数,它将数组、谓词和运算符作为参数,并将运算符应用于满足谓词的数组元素
- 存储指向动态数组元素的指针
- C++通过别名指针以静默方式将错误的类型分配给数组元素
- 在 std::map 中插入数组元素
- 使用指针访问数组元素时出现意外结果
- c++ 使用动态分配运算符反向数组元素
- 为什么在 c++ 中分配 char 数组元素时,分配的字符会被销毁?
- 缺少数组元素问题
- 如何在类中制作 2D 数组元素,然后在其构造函数中指定其维度?
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 删除在结构 c++ 中声明的数组元素
- Getter 和 Setter 用于类 C++ 中的数组元素
- 尝试递归获取数组元素的总和
- 使用SWIG将numpy数组元素(int)传递给c++int