有时在我的代码中,我发现自己想要定义同一类的多个实例,定义的差异相对于其整体长度来说很小,并且共享一些共同的指示符。而且 - 我努力重构代码,使其既紧凑又易于使用。
示例:我从以下内容开始:
auto blue_A = std::make_unique<float[]>(n);
auto blue_B = std::make_unique<float[]>(m);
auto blue_C = std::make_unique<float[]>(k);
这有点令人讨厌:重复命令和名称前缀...:-(
我可以将这些变量放入名为
blue
的结构中,以便我可以编写
do_stuff_with(blue.foo, blue.baz, 123);
而不是
do_stuff_with(blue_foo, blue_baz, 123);
但是 - 那么我甚至需要更多重复:
struct {
std::unique_ptr<float[]> foo, bar, baz;
} blue = {
std::make_unique<float[]>(n),
std::make_unique<float[]>(m),
std::make_unique<float[]>(k),
};
太浪费了!我至少想写一些类似的东西:
struct { auto foo, bar, baz; } foo = {
std::make_unique<float[]>(n),
std::make_unique<float[]>(m),
std::make_unique<float[]>(k),
};
但这不可能。
另外,我不想重复 make_unique 调用。我想我可以写一个 lambda:
auto make_data = [](std::size_t size) { return std::make_unique<float[]>(size); }
然后说
struct { auto foo, bar, baz; } blue = { make_data(n), make_data(m), make_data(k) };
但是 lambda 写得很多;而且它并没有节省那么多。即使这样也有一些重复。
使我的初始代码紧凑且可读的惯用方法是什么?
您可以创建一个返回
std::tuple
或 unique_ptr
的函数,然后使用结构绑定。
auto make(float n, float m, float k)
{
return std::tuple{std::make_unique<float[]>(n), std::make_unique<float[]>(m), std::make_unique<float[]>(k)};
}
auto [blue_A, blue_B, blue_C] = make(n,m, k);