Идиома именованного параметра полезна здесь.В вашем случае, у вас может быть
class PatchBuilder
{
public:
PatchBuilder() { }
PatchBuilder& radius(int r) { _radius = r; return *this; }
PatchBuilder& renderer(Renderer* r) { _renderer = r; return *this; }
PatchBuilder& color(const Color& c) { _color = c; return *this; }
PatchBuilder& initial(const Position& p) { _position = p; return *this; }
PatchBuilder& visibility(bool v) { _visibility = v; return *this; }
private:
friend class MovablePatch;
int _radius;
Renderer* _renderer;
Color _color;
Position _position;
bool _visibility;
};
class MovablePatch
{
public:
MovablePatch( const PatchBuilder& b ) :
_radius( b._radius );
_renderer( b._renderer );
_color( b._color );
_position( b._position );
_visibility( b._visibility );
{
}
private:
int _radius;
Renderer* _renderer;
Color _color;
Position _position;
bool _visibility;
};
, тогда вы используете его так, чтобы
int
main()
{
MovablePatch foo = PatchBuilder().
radius( 1.3 ).
renderer( asdf ).
color( asdf ).
position( asdf ).
visibility( true )
;
}
слишком упростил, но я думаю, что это понятно.Если требуются определенные параметры, они могут быть включены в конструктор PatchBuilder
:
class PatchBuilder
{
public:
PatchBuilder(const Foo& required) : _foo(required) { }
...
};
Очевидно, что этот шаблон вырождается в исходную проблему, если требуются все аргументы, и в этом случае идиома именованного параметра не применима,Дело в том, что это не одно решение, подходящее для всех решений, и, как Адам описывает в комментарии ниже, существуют дополнительные расходы и некоторые накладные расходы при этом.