2010-07-16 4 views
1

В разделе 14.1.4 новый стандарт C++ 0x описывает не типы, разрешенные в качестве параметров шаблона.Что такое ссылка lvalue на функцию?

4) Не-типа шаблона параметр должен иметь одно из следующих (необязательно CV квалифицированных) типов:

  • интегрального или перечисления типа,
  • указатель на объект или указатель на функцию,
  • Ссылка lvalue на объект или значение ссылки на функцию,
  • Указатель на элемент.

Что такое ссылка на функцию lvalue? Как это выглядит в списке шаблонов paramemter. Как он используется?

Я хочу что-то вроде этого:

//pointer to function 
typedef int (*func_t)(int,int); 

int add(int lhs, int rhs) 
{ return lhs + rhs; } 

int sub(int lhs, int rhs) 
{ return lhs - rhs; } 

template< func_t Func_type > 
class Foo 
{ 
public: 
    Foo(int lhs, int rhs) : m_lhs(lhs), m_rhs(rhs) { } 

    int do_it() 
    { 
     // how would this be different with a reference? 
     return (*Func_type)(m_lhs,m_rhs); 
    } 
private: 
    int m_lhs; 
    int m_rhs; 
}; 

int main() 
{ 
    Foo<&add> adder(7,5); 
    Foo<&sub> subber(7,5); 

    std::cout << adder.do_it() << std::endl; 
    std::cout << subber.do_it() << std::endl; 
} 

ответ

3

Ваш func_t имеет тип указатель на функцию; Вы можете также объявить тип, который является ссылкой на функцию:

typedef int (&func_t)(int, int); 

Тогда ваш main() будет выглядеть так:

int main() 
{ 
    Foo<add> adder(7,5); 
    Foo<sub> subber(7,5); 

    std::cout << adder.do_it() << std::endl; 
    std::cout << subber.do_it() << std::endl; 
} 
+0

И что запрещено это новый «Rvalue ссылка», которая является частью поддержка языков для конструкторов перемещения (обобщение 'std :: move'). Например. 'typedef int (&& func_t) (int, int);' не даст тип, который можно использовать в шаблоне. –

+0

Как выглядит функция 'do_it()'? Могу ли я использовать func_t так же, как имя функции? –

+0

@Caspin: Остальная часть кода точно такая же. Единственное, что я хотел бы отметить, это то, что вы не используете _ * для использования '*' на 'Func_type' (вам также не нужно использовать его с указателем функции). –

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