2015-03-10 4 views
0

Я хочу в качестве примера убедиться, что значения 2/3 находятся в заданном пороге. Следующий код выполняет это, но мне интересно, существует ли более общий подход.C++ Комбинаторная проверка того, что подмножество условий встречается

struct foo { 
    int id; 
    float item1; 
    float item2; 
    float item3; 
} 

bool ConditionCheck(foo val1, foo val2, foo val3) { 
    int count = 0; 
    if (abs(val1.item1 - val2.item1) < val3.item1) { 
    count++; 
    } 
    if (abs(val1.item2 - val2.item2) < val3.item2) { 
    count++; 
    } 
    if (abs(val1.item3 - val2.item3) < val3.item3) { 
    count++; 
    } 

    if (count >= 2) { 
    return true; 
    } 
    return false; 
} 

Проблема стебли для пользовательских структур еще, имеющие параметры как массивы:

// assuming array holds: [id, item1, item2, item3] 
bool ConditionCheck(float (&val1)[4], float (&val2)[4], float(&threshold)[4]) { 
    int count = 0; 
    for (unsigned int i = 1; i < 4; ++i) { 
    if (abs(val1[i] - val2[i]) < threshold[i]) { 
     count++; 
    } 
    } 
    if (count >= 2) { 
    return true; 
    } 
    return false; 
} 
+0

Ну, например вы можете просто do 'return count> = 2', нет необходимости в' if'. – aruisdante

+0

Что вы хотите сделать более общим? количество баллов? состояние? вы можете начать инкапсулировать свою функцию if в функцию и перебрать свои вещи. – Alex

ответ

5

Вы можете использовать массив указателей на член:

bool ConditionCheck(foo val1, foo val2, foo val3) { 
    float foo::* ptrs[3] = { &foo::item1, &foo::item2, &foo::item3 }; 
    return std::count_if(&ptrs[0], 
         &ptrs[3], 
         [&](float foo::* p) 
         { 
          return abs(val1.*p - val2.*p) < val3.*p; 
         }) >= 2; 
} 
Смежные вопросы