在 C++ 中,使用由多个字符串组成的类或结构来表示 URL 可能是合理的,如下所示:
结构基本{ std ::字符串协议; std ::字符串用户名; std ::字符串密码; std ::字符串主机名; std ::字符串端口; std ::字符串路径名; std ::字符串搜索; std ::字符串哈希; } ;
您可以为每个组件(协议、用户名等)关联一个索引,如下所示:
枚举类组件{ 协议= 0 , 用户名= 1 , 密码= 2 , 主机名= 3 , 端口= 4 , 路径名= 5 , 搜索= 6 , 哈希= 7 , } ;
然后您可能想要做的是通过索引访问组件。下面的代码可能会这样做:
std::string& get_component(basic& url, 组件 comp) { 开关(补偿) { case组件::协议:返回url 。协议; case组件:: USERNAME :返回url 。用户名; case组件:: PASSWORD :返回url 。密码; case组件:: HOSTNAME :返回url 。主机名; case组件:: PORT :返回url 。港口; case组件:: PATHNAME :返回url 。路径名; case组件:: SEARCH :返回url 。搜索; case组件:: HASH :返回url 。哈希; } }
但是,如果您不断通过索引访问值怎么办?您可能担心 switch/case 的开销可能太大。
相反,您可以翻转数据结构并将值存储在数据结构内的数组中。以下方法可能有效:
结构脂肪{ std :: array < std :: string , 7 >数据; std ::字符串&协议=数据[ 0 ] ; std ::字符串&用户名=数据[ 1 ] ; std ::字符串&密码=数据[ 2 ] ; std ::字符串&主机名=数据[ 3 ] ; std ::字符串&端口=数据[ 4 ] ; std ::字符串&路径名=数据[ 5 ] ; std ::字符串&搜索=数据[ 6 ] ; std ::字符串&哈希=数据[ 7 ] ; } ;
有了这个新的数据结构,通过索引获取组件变得更简单:
std :: string & get_component ( fat & url ,组件 comp ) { 返回网址。数据[ int ( comp ) ] ; } ;
不幸的是,新的 fat 数据结构中的每个引用可能使用 8 个字节。如果您希望只有很少的数据结构实例,那么这不是问题。但是,如果您这样做,您可能希望避免引用。您可以尝试通过简单的方法替换引用:
结构高级{ std :: array < std :: string , 7 >数据; std :: string & protocol ( ) {返回数据[ 0 ] ; } std :: string & username ( ) {返回数据[ 1 ] ; } std ::字符串和密码( ) {返回数据[ 2 ] ; } std :: string &主机名( ) {返回数据[ 3 ] ; } std :: string & port ( ) {返回数据[ 4 ] ; } std :: string &路径名( ) {返回数据[ 5 ] ; } std :: string & search ( ) {返回数据[ 6 ] ; } std :: string & hash ( ) {返回数据[ 7 ] ; } } ;
它并不完全令人满意,因为它需要调用方法而不是访问属性。
我不确定你目前在 C++ 中是否可以做得更好。
原文: https://lemire.me/blog/2024/12/16/accessing-the-attributes-of-a-struct-in-c-as-array-elements/