привязка метода c ++ через шаблоны - PullRequest
2 голосов
/ 13 марта 2012

Я пытаюсь написать несколько шаблонов для переноса классов в JavaScript. В основном это делается через SetAccessor (), определяя имя для метода доступа и функцию-член, которая должна быть вызвана. Я создал что-то вроде этого:

template <typename Ret, typename T>
void mbind (const char* name, Ret (T::*method)())
{
    ...
    objectTemplate->SetAccessor (String::NewSymbol(name),get_value<Ret,T>);
    ...
}

И это текущее определение get_value:

template <typename Ret, typename T>
Handle<Value> get_value (Local<String> name, const AccessorInfo& info)
{
    ...
}

Идея состоит в том, чтобы автоматически связать функцию следующим образом:

mbind ("getX",&SomeClass::getX);

Но это не сработает, если у меня есть два метода, подобных этому:

int SomeClass::getX ();
int SomeClass::getY ();

, поскольку Ret и T одинаковы в обоих случаях. Как я могу получить различные экземпляры шаблона для этих двух случаев?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 13 марта 2012

N., Извините за мой поздний ответ. Я попробовал два решения, основанные на том, что вы сказали, и ни одно из них не работает:

решение 1:

template <typename Ret, typename T, Ret(T::*mptr)()>
Handle<Value> get_value (Local<String> name, const AccessorInfo& info)
{
    ...
}


template <typename Ret, typename T>
void mbind (const char* name, Ret (T::*mptr)())
{
    ....
    objectTemplate->SetAccessor (String::NewSymbol (name),get_value<Ret,T,mptr>);

}

решение 2:

template <typename M, M mptr>
Handle<Value> get_val (Local<String> name, const AccessorInfo& info)
{
    ...
}


template <typename Ret, typename T>
void register_get_mem_fun (const char* name, Ret(T::*mptr)())
{
    v8::HandleScope localScope;

    typedef Ret (T::*M)();

    ....

    objectTemplate->SetAccessor (String::NewSymbol (name),get_val<M,mptr>);
}

В обоих случаях ошибка практически одинакова:

wrapper.h:184:5: error: ‘mptr’ is not a valid template argument for type ‘int (Cell::*)()’
wrapper.h:184:5: error: it must be a pointer-to-member of the form `&X::Y'
0 голосов
/ 13 марта 2012

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

template <class Ret, class T, Ret (T::* method)()>
void mbind(const char* name)
{
   .... get_value<Ret, T, method>() ...
}

template <typename Ret, typename T, Ret (T::* method)()> 
Handle<Value> get_value (Local<String> name, const AccessorInfo& info) 
{
    ....
}

mbind<int, SomeClass, &SomeClass::GetX>("GetX");

РЕДАКТИРОВАТЬ

Кажется, у меня больше времени: я думаю, что следующее немного лучше, так как это позволит использовать любые аргументы и уменьшить количество параметров:

template <class MethodT, MethodT method>
void mbind(const char* name)
{
    .... get_value<MethodT, method>() ....
}

template <class MethodT, MethodT method> 
Handle<Value> get_value (Local<String> name, const AccessorInfo& info) 
{
    ....
}

mbind<int (SomeClass::*)(), &SomeClass::GetX>("GetX");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...