Привет, Я пытаюсь написать класс делегата, который может принимать аргумент шаблона, аналогичный стандартной сигнатуре функции, и создать делегат для указателя функции-члена, как показано ниже в основном. Код может быть упрощен, но это то, что я искал, было простым и быстрым решением этой проблемы с минимальными накладными расходами. Я думаю, что эта реализация очень близка к достижению того, что я хочу, могу ли я получить тип Т в классе без выполнения полиморфизма и т.д.std :: function like delegate template class
template<class T>
struct FastDelegate {};
template<class R, class... Args>
struct FastDelegate<R (Args...)>
{
template <typename T>
FastDelegate(T* t, R (T::*f)(Args...)) : m_t(t), m_f(f) {}
R operator()(Args... p)
{
return (m_t->*m_f)(std::forward<Args>(p)...);
}
T* m_t; // How can I capture T as a type in this partial specialization?
R (T::*m_f)(Args...);
};
struct Test
{
int add (int x, int y) { return x+y; }
};
int main()
{
int x = 5;
int y = 4;
Tester t;
FastDelegate<int (int,int)> d (&t, &Test::calc);
int z = d(x,y);
}
Er, вся точка делегата, чтобы удалить тип во время компиляции, так что вы не можете получить доступ к типу, если вы стер ... – Mehrdad
Кроме того, я думаю, что на «виртуальное наследование «вы, вероятно, имели в виду« полиморфизм времени выполнения », поскольку виртуальное наследование фактически не имеет к этому никакого отношения. – Mehrdad
да, это то, что я имел в виду. Исправлено – bjackfly