Я пытаюсь использовать std::mem_fun_ref
(Да, устаревшая версия . Причины ниже), чтобы вызвать функцию-член через прокси-сервер.Использование mem_fun_ref с прокси-объектом
template<typename T>
struct proxy {
T& operator*() { return *t; }
T* operator->() { return t; }
// no address of etc
T* t;
};
struct A {void foo() {}};
int main()
{
A a;
proxy<A> pa = {&a};
std::mem_fun_ref_t<void, A>
fn = std::mem_fun_ref(&A::foo);
fn(pa); // borks
return 0;
}
Это хорошо работает с 11 C++ std::mem_fn
, но не boost::mem_fn
, но я могу использовать ни один из них, как мне нужно указать тип связующего вещества в другое место и тип полученного связующего is не указан для boost::mem_fn
. Это не было бы проблемой, если бы я мог использовать decltype
, но я не могу, так как код должен быть совместим с C++ 03.
Что является самым простым способом обойти это? Таможня mem_fun_through_proxy
?
Редактировать: Еще одно предостережение в том, что класс proxy
не может быть изменен.
Что делать, если вы добавляете 'operator T &() {return * t}' в свой прокси-сервер? –
@ KerrekSB А, я забыл. Изменение прокси также невозможно. Фактически, это итератор. – pmr
Почему не 'fn (* pa)'? –