универсальный указатель функции-члена в качестве параметра шаблона

Рассмотрим этот код:

#include <iostream>
using namespace std;

class hello{
public:
    void f(){
        cout<<"f"<<endl;
    }
    virtual void ff(){
        cout<<"ff"<<endl;
    }
};

#define call_mem_fn(object, ptr)  ((object).*(ptr))

template<R (C::*ptr_to_mem)(Args...)> void proxycall(C& obj){
    cout<<"hello"<<endl;
    call_mem_fn(obj, ptr_to_mem)();
}

int main(){
    hello obj;
    proxycall<&hello::f>(obj);
}

Конечно, он не скомпилируется в строке 16, потому что компилятор не знает, что R, Cи Args, являются. Но есть еще одна проблема: если кто-то попытается определить эти параметры шаблона прямо перед ptr_to_mem, он столкнется с такой плохой ситуацией:

template<typename R, typename C, typename... Args, R (C::*ptr_to_mem)(Args...)> 
                             //  ^variadic template, but not as last parameter!
void proxycall(C& obj){
    cout<<"hello"<<endl;
    call_mem_fn(obj, ptr_to_mem)();
}

int main(){
    hello obj;
    proxycall<void, hello, &hello::f>(obj);
}

Удивительно, но g++ не жалуется на то, что Argsне является последний параметр в списке шаблонов, но в любом случае он не может связать proxycallс нужной функцией шаблона и просто отмечает, что это возможный кандидат.

Есть решение? Мое последнее средство — передать указатель функции-члена в качестве аргумента, но если бы я мог передать его в качестве параметра шаблона, он лучше подходил бы к остальной части моего кода.

РЕДАКТИРОВАТЬ: как некоторые указали, пример кажется бессмысленным, потому что proxycall не будет передавать никаких аргументов. Это не так в реальном коде, над которым я работаю: аргументы извлекаются с помощью некоторых приемов шаблона из стека Lua. Но эта часть кода не имеет отношения к вопросу и довольно длинна, поэтому я не буду вставлять ее сюда.

24
задан Lorenzo Pistone 19 March 2012 в 23:45
поделиться