如何最好地使用一些临时类实例进行 DRY?

问题描述 投票:0回答:1

有时在我的代码中,我发现自己想要定义同一类的多个实例,定义的差异相对于其整体长度来说很小,并且共享一些共同的指示符。而且 - 我努力重构代码,使其既紧凑又易于使用。

示例:我从以下内容开始:

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 写得很多;而且它并没有节省那么多。即使这样也有一些重复。

使我的初始代码紧凑且可读的惯用方法是什么?

c++ initialization idioms type-deduction
1个回答
0
投票

您可以创建一个返回

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);

© www.soinside.com 2019 - 2024. All rights reserved.