gpt4 book ai didi

c++ - 避免复制粘贴代码初始化结构中的一系列 SDL_Rect

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:56:20 25 4
gpt4 key购买 nike

我有一个用于在我的 2D 引擎中定义特征图形的结构。在那里,有一系列 SDL_Rects 称为“middle, left_edge, top_left_corner”等。在我的部分代码中,我将它们从一系列参数类型初始化到脚本引擎/命令行中,这些参数存储为 vector std::strings.

作为风格问题,并避免由于重复而导致的愚蠢错误(并且必须纠正任何错误 9 次),有什么方法可以清理这段代码吗?或者这是否合理?

//RectZeroes is just an SDL_Rect of {0,0,0,0} to ensure that it is initialised

SDL_Rect middle = RectZeroes;
if (args.size() >= 6 )
{
middle.x = boost::lexical_cast<int>(args[3]);
middle.y = boost::lexical_cast<int>(args[4]);
middle.w = boost::lexical_cast<int>(args[5]);
middle.h = boost::lexical_cast<int>(args[6]);
}

SDL_Rect left_edge = RectZeroes;
if (args.size() >= 10 )
{
left_edge.x = boost::lexical_cast<int>(args[7]);
left_edge.y = boost::lexical_cast<int>(args[8]);
left_edge.w = boost::lexical_cast<int>(args[9]);
left_edge.h = boost::lexical_cast<int>(args[10]);
}
//And so on

最佳答案

我同意这不是一个令人愉快的代码。为了避免重复,在编程中一如既往地做同样的事情:封装——在这种情况下,封装结构并给它一个合适的构造函数,并围绕 boost::lexical_cast<int>(x) 编写一个薄的包装器。 .

或者,如果你想避免包装 SDL_Rect然后写一个初始化函数:

template <typename TString>
int parse_int(TString const& value) { return boost::lexical_cast<int>(value); }

void init_sdl_rect_from_args(
SDL_Rect& rect, std::vector<std::string> const& args, unsigned offset)
{
rect.x = parse_int(args[offset + 0]);
rect.y = parse_int(args[offset + 1]);
rect.w = parse_int(args[offset + 2]);
rect.h = parse_int(args[offset + 3]);
}

然后:

SDL_Rect middle = RectZeroes;
if (args.size() >= 6)
init_sdl_rect_from_args(middle, args, 3);

SDL_Rect left_edge = RectZeroes;
if (args.size() >= 10)
init_sdl_rect_from_args(left_edge, args, 7);

更好的是,让初始化器返回构造的结构。这使得使用起来更加方便(即在初始化程序中):

SDL_Rect rect_from_args(std::vector<std::string> const& args, unsigned offset) {
SDL_Rect rect;
rect.x = parse_int(args[offset + 0]);
rect.y = parse_int(args[offset + 1]);
rect.w = parse_int(args[offset + 2]);
rect.h = parse_int(args[offset + 3]);
return rect;
}

SDL_Rect middle = (args.size() >= 6) ? rect_from_args(args, 3) : RectZeroes;
SDL_Rect left_edge = (args.size() >= 10) ? rect_from_args(args, 7) : RectZeroes;

关于c++ - 避免复制粘贴代码初始化结构中的一系列 SDL_Rect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9260911/

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