Passing temporaries as non-const references in C++

У меня есть следующий кусок кода, в качестве примера dec_proxy пытается обратить эффекты оператора инкремента на тип, который выполняется в сложной функции call foo - которую btw я не могу изменить интерфейс.

#include <iostream>

template<typename T>
class dec_proxy
{
public:
   dec_proxy(T& t)
   :t_(t)
   {}

   dec_proxy<T>& operator++()
   {
      --t_;
      return *this;
   }

private:
   T& t_;
};

template<typename T, typename S, typename R>
void foo(T& t, S& s, R& r)
{
  ++t;
  ++s;
  ++r;
}

int main()
{
   int i = 0;
   double j = 0;
   short  k = 0;

   dec_proxy<int> dp1(i);
   dec_proxy<double> dp2(j);
   dec_proxy<short> dp3(k);

   foo(dp1,dp2,dp3);

   //foo(dec_proxy<int>(i),     <---- Gives an error
   //   dec_proxy<double>(j),     <---- Gives an error
   //   dec_proxy<short>(k));      <---- Gives an error 

   std::cout << "i=" << i << std::endl;

   return 0;
}

Проблема в том, что для различных типов, которые я хотел бы использовать dec_proxy, мне сейчас требуется создать специализированный экземпляр dec_proxy - это кажется очень грязным и ограниченным подходом.

Мой вопрос заключается в следующем: какой правильный способ передачи таких недолговечных временных параметров в качестве неконстантных ссылочных параметров?

9
задан Xander Tulip 5 October 2011 в 20:58
поделиться