Как отделить константную ссылку от значения?
От: ChainEG  
Дата: 29.10.09 16:04
Оценка:
Есть набор фубаров, унаследованных от общего абстрактного предка

class TFubar {};

class TFubarA: public TFubar {};
class TFubarB: public TFubar {};


Есть набор функций, помогающих получить нужный фубар. Причем некоторые их этих функций возвращают константную ссылку на уже существующий фубар, а некоторые возвращают новый фубар по значению.
TFubarA GetFubarA() { return TFubarA(); }
const TFubar& GetFubarRefB() { static TFubarB f; return f; }


Нужно сделать обертку для временного хранения фубара, типа такой:
template<typename FOOBAR>
class TFubarHolder {
  FOOBAR m_f;
 public:
  explicit TFubarHolder(FOOBAR f): m_f(f) {}
};


А еще хочется сделать функцию-хелпер для удобного создания временных оберток соответствующего типа. Что-то вроде этого:
template<typename FOOBAR>
TFubarHolder<FOOBAR> Hold(FOOBAR f)
{
  return TFubarHolder<FOOBAR>(f);
}


В общем, что-то наподобие std::pair и std::make_pair

Но сделать это нужно так, чтобы, если в функцию Hold() передать значение фубара, то обертка должна хранить значение фубара (копию).
А если в функцию Hold передать константную ссылку на фубар, то и обертка должна хранить константную ссылку на фубар.
Например:
Hold(GetFubarA());    // должно вернуть TFubarHolder<TFubarA>
Hold(GetFubarRefB()); // должно вернуть TFubarHolder<const TFubarB&> или TFubarHolder<const TFubar&>


Я пытался перегрузить функцию Hold(), чтобы одна вызывалась для ссылок, а другая — для значений. Не выходит — в обоих случаях перегрузка разрешается в пользу какой-то одной функции, а не разных. Либо перегрузка вообще не разрешается.

Есть ли какие-то решения? Есть ли решение, пригодное для MSVC6 (ограниченная поддержка шаблонов, в частности, отсутствие частичной специализации)?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.