2017-05-28 57 views
1

我有一個類可以處於兩種狀態之一。尋找一種實現以操作爲參數的表達式的方法

假設成員變量m_bCond確定對象的狀態。

現在,在很多類的成員函數,我有以下代碼模式:

if (m_bCond) 
{ 
    do some operation on 'm_vector[m_index]' 
} 
else 
{ 
    for (const auto& item : m_vector) 
    { 
     do some operation on 'item' 
    } 
} 

有沒有我可以使用以便做更「巧妙」任何好的語法?

我想能夠使用某種表達式,並將該操作作爲參數傳遞。

喜歡的東西:

Expression(operation) 
{ 
    if (m_bCond) 
    { 
     do 'operation' on 'm_vector[m_index]' 
    } 
    else 
    { 
     for (auto item : m_vector) 
     { 
      do 'operation' on 'item' 
     } 
    } 

這將是容易的,我做在Python中,例如,但我真的不知道關於C++。

我知道這可以用宏來完成,但這會讓我得到一段難以調試的代碼。所以我想我正在尋找某種類型的Lambda,或者是可能的成員函數。

謝謝。

+0

['std :: function'](http://en.cppreference.com/w/cpp/utility/functional/function)也許? –

+0

@πάνταῥεῖ'std :: function'聽起來像沒有意義的開銷。大概只是一個當地的lambda? – lisyarus

+0

@lisyarus如果你想通過例如lambdas作爲參數,你需要一個'std :: function'。由於OP要求將操作作爲參數... –

回答

3

你應該能夠作出接受一個lambda /仿函數/功能的通用功能,並將其應用到載體的載體或元素,像這樣

template<typename Operation> 
void apply(Operation operation) 
{ 
    if (m_bCond) 
    { 
     operation(m_vector[m_index]); 
    } 
    else 
    { 
     for (auto item : m_vector) 
     { 
      operation(item); 
     } 
    } 
} 

然後你可以使用它像這樣(用拉姆達使代碼更短):

MyType foo; 
//populate and set foo's members 
// set condition to true 
foo.apply([](auto& v){ v.push_back(10); }); 
// set condition to false 
foo.apply([](auto& i){ i *= 42; }); 
+0

太棒了。看起來就像我(有點)想的那樣。但有一個小問題:在某些情況下,操作會更改項目/項目,而在某些情況下則不會。這意味着,目前,我的'for'循環有時使用'auto&item',有時使用'const auto&item'。那麼我需要實現兩個不同的功能,還是可以在這兩種情況下對您的答案中的單個功能進行「模板化」?再次感謝!!! – goodvibration

+0

@goodvibration你可以將一個左值引用傳遞給一個函數,該函數需要引用'const'的左值,所以它可以按原樣工作。 – Quentin

相關問題