所以我有以下可用:
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));
当然,这是一种简化,每个作业中都会发生更多的事情。关键是我想在一个常量结构中表示键和结构成员之间的映射,并用它来转换循环中的最后一个代码。我正在寻找类似以下的内容:
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>);
}
}
然而,这有两个问题:
- 它不编译:) 但我相信这应该很容易解决。
- 我不确定如何获得
sizeof()
使用 strncpy/strlcpy 而不是 strcpy 的论点。我char *
用作成员的类型,所以我丢失了关于每个数组有多长的类型信息。另一方面,我不确定如何使用char[T]
每个成员的特定类型,因为如果每个结构成员指针具有不同的类型,我认为我无法将它们放在std::vector<T>
.