В разделе 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;
}
И что запрещено это новый «Rvalue ссылка», которая является частью поддержка языков для конструкторов перемещения (обобщение 'std :: move'). Например. 'typedef int (&& func_t) (int, int);' не даст тип, который можно использовать в шаблоне. –
Как выглядит функция 'do_it()'? Могу ли я использовать func_t так же, как имя функции? –
@Caspin: Остальная часть кода точно такая же. Единственное, что я хотел бы отметить, это то, что вы не используете _ * для использования '*' на 'Func_type' (вам также не нужно использовать его с указателем функции). –