2013-09-03 1 views
1

Мне нужно заполнить атрибуты x и y структуры. Учитывая, что у меня много членов (x, y ...), и у каждого из них есть одинаковые атрибуты (чтение, запись и т. Д.), Есть ли способ сделать это короче, чем это?Есть ли пути для заполнения структуры более коротким кодом?

features.x.Read = GetAttribute(node,"x","Read",HexValue); 
features.x.Write = GetAttribute(node,"x","Write",HexValue); 
features.x.address = GetAttribute(node,"x","address",HexValue); 
features.x.value = GetAttribute(node,"x","value",HexValue); 

features.y.Read = GetAttribute(node,"y","Read",HexValue); 
features.y.Write = GetAttribute(node,"y","Write",HexValue); 
features.y.address = GetAttribute(node,"y","address",HexValue); 
features.y.value = GetAttribute(node,"y","value",HexValue); 

Спасибо

+1

вам нужно показать сборку, если вы хотите получить ответ на этот вопрос. То, что вы показали, не является «инструкциями». – xaxxon

+0

Прошу прощения, что слово, которое я ищу, не является инструкцией. Здесь нет ничего общего с сборкой. – hlx

+2

Кажется, по крайней мере, вы могли бы написать одну функцию, которая работает как с функциями features.x, так и с функциями.y, что уменьшит вдвое количество кода. – john

ответ

9

, как это может быть,

void set_members(Whatever& member, const char* name) 
{ 
    member.Read = GetAttribute(node, name, "Read", HexValue); 
    member.Write = GetAttribute(node, name, "Write", HexValue); 
    member.address = GetAttribute(node, name, "address", HexValue); 
    member.value = GetAttribute(node, name, "value", HexValue); 
} 

set_members(feature.x, "x"); 
set_members(feature.y, "y"); 

Я не» Знаю, что должно быть Whatever, но вы можете понять это. Возможно, даже сделайте шаблон темным.

6

Ну, а не меньше инструкций, по крайней мере, меньше нажатий клавиш и несколько легче читать:

#define FILL(a, b) features.a.b = GetAttribute(node,#a,#b,HexValue) 

FILL(x, Read); 
FILL(x, Write); 
FILL(x, address); 
FILL(x, value); 

FILL(y, Read); 
FILL(y, Write); 
FILL(y, address); 
FILL(y, value); 

#undef FILL 
+0

... за счет легкой отладки, но +1, так как OP запрашивает «более короткий путь» – Bathsheba

+0

@Bathsheba Согласен, однако почти всегда есть стоимость, связанная с чем угодно. – trojanfoe

+1

Нет такой вещи, как бесплатный обед. Теперь, если вы извините меня, у меня есть бесплатный обед, чтобы украсть. –

3

Оба C и C++ имеют агрегатную инициализацию: показывая C-стиль: http://ideone.com/EXKtCo

struct X 
{ 
    int some; 
    const char* really_long; 
    double and_annoying_variable_names; 
}; 

int main() 
{ 
    struct X x = { 42, "hello world", 3.14 }; 
    // reassign: 
    struct X y = { 0, "dummy", 0.0 }; 
    x = y; 


    return 0; 
} 
+1

@alk О, ага. Извините за не-C-isms (я вообще C++). Надеюсь, это укрепило ваши проблемы. Я был бы признателен, если в следующий раз, когда вы просто позвонили мне («Не могли бы вы исправить образец», а не «Просьба уточнить»). Cheers – sehe

+0

На самом деле я не рекомендую этот способ, чтобы запустить агрегатную структуру данных. Если есть много одного и того же типа (например, int), и вы позже измените порядок последовательности элементов данных в структуре, вы получите ошибку времени выполнения вместо ошибки компиляции. – ZijingWu

+0

@ZijingWu На самом деле, это довольно странное предположение. Вы получите семантически неправильный код. Надеюсь, вы получите какой-то симптом. – sehe

Смежные вопросы