воскресенье, 25 марта 2012 г.

Простая задачка о произведении всех элементов в массиве

Не так давно столкнулся с простой задачей: посчитать произведение элементов в массиве. Первое решение, приходящее в голову:
namespace
{
  template<class T>
  class Multiply
  {
  public:
    Multiply(T& result) : TotalResult(result)
    {
    }

    void operator()(const T& v)
    {
      TotalResult *= v;
    }

  private:
    T& TotalResult;
  };
}

void main(void)
{
  int result = 1;
  Multiply<int> functor(result);
  int buffer[] = {1, 2, 3, 4};
  std::for_each(buffer, buffer + 4, functor);
  std::cout << "Result = " << result;
}
Поскольку for_each принимает последний параметр по значению, то функтору нужно передавать ссылку извне. Также, чтобы где-то сохранять ссылку на результат нам пришлось написать класс. Однако можно решить задачу и по-другому, используя std::bind1st.

понедельник, 19 марта 2012 г.

Мелочи жизни

В рабочем коде периодически натыкаюсь на код подобного вида:
class SomeClass
{
  //....
};
typedef std::auto_ptr<SomeClass> SomeClassAutoPtr;
typedef std::tr1::shared_ptr<SomeClass> SomeClassSharedPtr;
//....
SomeClassAutoPtr ptr = getSomePointer();
Читать подобные километровые названия не очень приятно. Решение получше:
class SomeClass
{
  //....
typedef std::auto_ptr<SomeClass> AutoPtr;
typedef std::tr1::shared_ptr<SomeClass> Ptr;
};
//...
SomeClass::AutoPtr ptr = getSomePointer();
ИМХО второй вариант выглядит куда приятнее первого, к тому же не засоряет "глобальное пространство имен".