2013-06-12 3 views
1

То, что я пытаюсь сделать, по существу, может вызвать функцию и зарегистрировать функцию C++ с помощью lua. В основном что-то вроде registerFunction (function). Теперь я знаю, что есть библиотеки, которые делают это за вас, однако я хочу узнать, как кто-то будет писать такую ​​библиотеку.:: func не была объявлена ​​ошибка

Мой текущий метод заключается в использовании шаблонов для создания соответствующей функции клея для передаваемой ему функции.

Мой код прямо сейчас выглядит следующим образом:

template<typename F> 
struct registerStruct 
{ 
    template<typename T> 
    struct inner 
    { 
     static int func(lua_State*); 
    }; 
}; 
template<typename F> 
void registerFunction(const char *name,F function) 
{ 
    lua_register(this->L,name,&registerStruct<decltype(function)>::inner<function>::func); 
} 

template<typename F> 
struct registerStruct<F(void)> //I would write more classes for different numbers of arguments 
{ 
    template<F(*T)(void)> 
    struct inner 
    { 
     static int func(lua_State *L) 
     { 
      returnLua(L,T()); //push the return value onto lua's stack 
      return 1; 
     } 
    }; 
}; 

Тогда я пытаюсь использовать его как это:

int test(void) 
{ 
    std::cout<<"hello from c++"<<std::endl; 
    return 0; 
} 

registerFunction("test",test); 

Компиляция с GCC дает ошибку :: FUNC не была объявлена.

+1

Почему вы используете 'this->' в функции, не являющихся членами? – 0x499602D2

ответ

1
registerStruct<decltype(function)>::inner<function>::func 

С одной стороны, decltype(function) можно заменить F.

Кроме того, шаблон шаблона inner ожидает тип в качестве аргумента шаблона, а function - это выражение, а не тип. Вероятно, это должно быть ::inner<F>.

(Или, может быть, inner не должен быть шаблон вообще. Вложенный класс outer<T>::inner все еще можно использовать параметр T шаблона, прикрепленный к его ограждающему классу.)

Синтаксиса C++ требует несколько странных вещей, чтобы помочь аналитики выясняют, что означают шаблоны. Обычно значение C++ зависит от того, является ли идентификатор переменной (объектом или ссылкой), типом или шаблоном. Но после или . или -> в шаблоне, если тип левой части оператора зависит от параметра шаблона, во время начального синтаксического анализа было бы невозможно определить следующее имя. Если вы не поможете, язык будет считать имя переменной.

Так что C++ считает, что registerStruct<decltype(function)>::inner является переменной. Тогда у нас есть оператор меньше <, за которым следует действительное выражение function, затем оператор большего размера >, а затем ::func. Подождите, ничего не называется ::func!

Чтобы указать inner действительно шаблон, вам нужно

&registerStruct<F>::template inner<F>::func 
+0

> decltype (function) можно заменить на F. Но F - int (\ *) (void), а все мои шаблоны написаны в терминах сигнатур функций. Разумеется, они должны быть разными, поскольку std :: function не будет компилироваться, пока std :: function will. > Кроме того, внутренний шаблон класса ожидает тип как его аргумент шаблона, а функция - выражение. Но мне нужно, чтобы T был указателем на функцию, иначе это не сработает. Как шаблон void function (void) {T()} принимает указатель на функцию, но мой шаблон не может? – user467526

+0

Поскольку вы помещаете 'template struct inner', аргумент шаблона для' inner' должен всегда быть типом. 'template ' задает параметр шаблона непигового типа; то есть определенное значение точно указанного типа. – aschepler

Смежные вопросы