C ++ встроенные шаблоны

У меня есть класс, который «оборачивает» метод AngelScript. По сути, вы отправляете ему класс, тип возвращаемого метода, указатель на метод и список аргументов.

Пока я могу успешно сделать это Method объект, когда я ‘привязываю’ метод класса, который не принимает параметров. Однако, если я пытаюсь добавить параметры, это ломается.

Я делаю что-то вроде этого:

template<typename C, typename R, R (C::*fn)(), typename... Arguments>
class Method {
public:
Method()
{
const asSFuncPtr& func = asSMethodPtr<sizeof( void (C::*)() )>::Convert( AS_METHOD_AMBIGUITY_CAST( R (C::*)(Arguments... parameters)) (fn) );
function = &func;
};
virtual ~Method(){};
const asSFuncPtr* function;
};

struct S
{
int f()
{
return 5;
}

int f(int a)
{
return a + 1;
}
};

А потом создавая мой Method объект вроде так:

Method<S, int, &S::f> m = Method<S, int, &S::f>();

Это работает.

Тем не менее, если я попытаюсь сделать метод объекта, как это:

Method<S, int, &S::f, int> m2 = Method<S, int, &S::f, int>();

Это разрывается с этим сообщением:

template_tests.cpp: In instantiation of ‘Method<C, R, fn, Arguments>::Method() [with C = S; R = int; R (C::* fn)() = &S::f; Arguments = {int}]’:
template_tests.cpp:74:61:   required from here
template_tests.cpp:27:142: error: invalid static_cast from type ‘int (S::*)()’ to type ‘int (S::*)(int)’

Что имеет смысл, так как я передаю указатель на функцию, у которой нет параметров.

Теперь, как я могу изменить Method класс, чтобы принять указатели на методы класса, которые имеют различное количество параметров?

Я делаю что-то вроде этого:

template<typename C, typename R, R (C::*fn)(Arguments... parameters), typename... Arguments>
class Method {
...
}

Потому что это вызывает всевозможные ошибки ..

По сути, я предполагаю, что я спрашиваю — как я могу «встроить» вариационные шаблоны в шаблон? Это возможно?

1

Решение

На первый взгляд, это похоже на ваш Method Класс на самом деле не нуждается в типе возвращаемого значения и типах аргументов, ему просто нужен весь тип функции. В таком случае, Method можно определить так:

template <typename C,typename Func,Func C::*fn>
struct Method {
public:
Method()
{
const asSFuncPtr& func =
asSMethodPtr<sizeof( void (C::*)() )>::Convert(
AS_METHOD_AMBIGUITY_CAST(Func C::*) (fn)
);
function = &func;
};
virtual ~Method(){};
const asSFuncPtr* function;
};

и затем используется следующим образом, если метод не принимает параметров:

Method<S, int(), &S::f> m;

или это если метод принимает параметр int:

Method<S, int(int), &S::f> m;
2

Другие решения

Других решений пока нет …