"Совместить" указатель и ссылку в аргументе функции
Есть две функции:
template<class T>
void Foo_ref(T &x) { x.some_method(); }
template<class T>
void Foo_ptr(T *x) { x->some_method(); }
В полном коде функции намного больше. Но суть именно такая - в одной аргумент используется как указатель, в другой как ссылка, в остальном код идентичен. Хочется устранить дублирование кода, оставив только одну функцию, при этом чтобы вызовы остались теми же (вариант сделать вместо вызовов Foo(x_ref) и Foo(x_ptr) вызовы Foo(x_ref) и Foo(*x_ptr) не хочется использовать).
Один из способов - сделать класс-враппер, который инициализируется по ссылке или указателю, а внутри одинаковым интерфейсом пробрасывает вызовы всех функций на содержимое. Что-то вроде такого:
template<class T>
class wrapper_ptr_ref
{
T *x;
public:
wrapper_ptr_ref(T &i_x) : x(&i_x) {}
wrapper_ptr_ref(T *i_x) : x( i_x) {}
T& operator T ()
{
return *x;
}
}
template<class T>
void Foo_ptr(wrapper_ptr_ref<T> x) { x.some_method(); }
Но может в stl уже есть что-то подобное ? То есть хочется враппер, который объединяет интерфейс ссылки и указателя.