gpt4 book ai didi

c++ - C++中使用struct成员指针填充一个struct

转载 作者:太空狗 更新时间:2023-10-29 21:33:03 30 4
gpt4 key购买 nike

所以我有以下可用的:

struct data_t {
char field1[10];
char field2[20];
char field3[30];
};
const char *getData(const char *key);
const char *field_keys[] = { "key1", "key2", "key3" };

此代码已提供给我,我无法以任何方式修改它。它来自一些旧的 C 项目。

我需要使用 getData 填充结构不同键的功能,如下所示:

struct data_t my_data;
strncpy(my_data.field1, getData(field_keys[0]), sizeof(my_data.field1));
strncpy(my_data.field1, getData(field_keys[1]), sizeof(my_data.field2));
strncpy(my_data.field1, getData(field_keys[2]), sizeof(my_data.field3));

当然,这是一个简化,每个assignment中都会有更多的事情发生。关键是我想在一个常量结构中表示键和结构成员之间的映射,并用它来转换循环中的最后一个代码。我正在寻找类似以下内容的内容:

struct data_t {
char field1[10];
char field2[20];
char field3[30];
};

typedef char *(data_t:: *my_struct_member);
const std::vector<std::pair<const char *, my_struct_member>> mapping = {
{ "FIRST_KEY" , &my_struct_t::field1},
{ "SECOND_KEY", &my_struct_t::field2},
{ "THIRD_KEY", &my_struct_t::field3},
};

int main()
{
data_t data;

for (auto const& it : mapping) {
strcpy(data.*(it.second), getData(it.first));
// Ideally, I would like to do
// strlcpy(data.*(it.second), getData(it.first), <the right sizeof here>);
}
}

然而,这有两个问题:

  1. 它不编译 :) 但我相信应该很容易解决。
  2. 我不确定如何获得 sizeof()使用 strncpy/strlcpy 而不是 strcpy 的参数。我正在使用 char *作为成员的类型,所以我丢失了关于每个数组有多长的类型信息。另一方面,我不确定如何使用具体的 char[T]每个成员的类型,因为如果每个结构成员指针都有不同的类型,我认为我无法将它们放在 std::vector<T> 中。 .

最佳答案

正如我在评论中所解释的那样,如果您可以存储足够的信息来处理映射中的字段,那么您可以编写一个函数来执行相同的操作。

因此,编写一个函数来执行此操作,使用数组引用来确保您所做的是安全的,例如:

template <std::size_t N>
void process_field(char (&dest)[N], const char * src)
{
strlcpy(dest, getData(src), N);

// more work with the field...
};

然后简单地,而不是你的 for 循环:

process_field(data.field1, "foo");
process_field(data.field2, "bar");
// ...

请注意,行数与映射相同(每个字段一个),因此在重复方面这并不比映射解决方案差。

现在,优势:

  • 更容易理解。

  • 更快:不需要内存来保存映射,更容易优化等。

  • 允许您根据需要轻松地为不同的领域编写不同的函数。


此外,如果你的两个字符串在编译时都是已知的,你甚至可以这样做:

template <std::size_t N, std::size_t M>
void process_field(char (&dest)[N], const char (&src)[M])
{
static_assert(N >= M);
std::memcpy(dest, src, M);

// more work with the field...
};

这将永远是安全的,例如:

process_field(data.field1, "123456789");  // just fits!
process_field(data.field1, "1234567890"); // error

哪个有更多优点:

  • 方式比任何 strcpy 变体都快(如果调用是在运行时完成的)。

  • 保证编译时安全而不是运行时。

关于c++ - C++中使用struct成员指针填充一个struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52952485/

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