Есть набор фубаров, унаследованных от общего абстрактного предка
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 (ограниченная поддержка шаблонов, в частности, отсутствие частичной специализации)?