我有一个可以处于两种状态之一的课程。
假设成员变量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 :(得分:3)
您应该能够创建一个接受lambda / functor / function的泛型函数,并将其应用于向量或向量的元素,如此
template<typename Operation>
void apply(Operation operation)
{
if (m_bCond)
{
operation(m_vector[m_index]);
}
else
{
for (auto item : m_vector)
{
operation(item);
}
}
}
然后你就可以像这样使用它(使用lambda来缩短代码):
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; });