所以我有以下可用的选项:
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>);
}
}
然而,这里有两个问题:
- 它无法编译 :) 但我相信这应该很容易解决。
- 我不确定如何获取
strncpy/strlcpy
的sizeof()
参数,而不是使用strcpy
。我使用char *
作为成员类型,因此我失去了关于每个数组长度的类型信息。另一方面,我也不确定如何使用每个成员的特定char[T]
类型,因为如果每个结构体成员指针都有不同的类型,我不认为我能将它们放在std::vector<T>
中。
std::string
的原因是因为它们是用于某个固定记录大小存储的固定长度结构吗?如果是这样的话,那就可以理解;只是好奇。 - WhozCraigsizeof(my_data.field1)
应该作为strncpy()
的参数,而不是getData()
。 - Barmarstrlcpy
那么容易呢? - José D.