шаблоны — что делает эта шаблонная функция с ++

Я пытаюсь написать тонкую обертку AngelScript. У меня проблемы с выяснением, как обернуть вокруг определенной структуры.

Вот определение структуры для структуры, которую я хочу обернуть, asSMethodPtr:

template <int N>
struct asSMethodPtr
{
template<class M>
static asSFuncPtr Convert(M Mthd)
{
// This version of the function should never be executed, nor compiled,
// as it would mean that the size of the method pointer cannot be determined.

int ERROR_UnsupportedMethodPtr[N-100];

asSFuncPtr p;
return p;
}
};

Вот определение для asSFuncPtr:

struct asSFuncPtr
{
union
{
char dummy[25]; // largest known class method pointer
struct {asFUNCTION_t func; char dummy[25-sizeof(asFUNCTION_t)];} f;
} ptr;
asBYTE flag; // 1 = generic, 2 = global func
};

Вот код, который я нашел (взят из AngelBinder библиотека), которая позволяет мне «обернуть» его:

template<typename R> ClassExporter& method(std::string name, R (T::*func)())
{
MethodClass mthd(name, Type<R>::toString(), asSMethodPtr< sizeof( void (T::*)() ) >::Convert( AS_METHOD_AMBIGUITY_CAST( R (T::*)()) (func) ));
this->_methods.push(mthd);
return *this;
}

К сожалению, я понятия не имею, что делает этот код …

Что такое T::* должен делать? Указатель на тип класса?

Что такое R (T::*func)()?

Любая помощь приветствуется …

2

Решение

T::* является указателем на член. R (T::*func)() указатель на функцию-член, которая возвращает R и принимает 0 параметров. Например:

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

int x = 10;
};

int main()
{
S s;

int S::* ptr = &S::x;

std::cout << s.*ptr; // 10

int (S::*f_ptr)() = &S::f;

std::cout << (s.*f_ptr)(); // 5
}

Прочитайте больше Вот.

2

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

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