什么是左值函数的参考?

时间:2010-07-16 00:49:21

标签: c++ templates

在§14.1.4中,新的C ++ 0x标准描述了允许作为模板参数的非类型。

  

4)非类型模板参数应具有以下之一(可选 cv-qualified )类型:

     
      
  • 整数或枚举类型,
  •   
  • 指向对象或指向函数的指针,
  •   
  • 对对象的左值引用或对函数的左值引用,
  •   
  • 指向会员的指针。
  •   

什么是“左右功能参考”?它在模板参数列表中看起来如何。它是如何使用的?

我想要这样的事情:

//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;
}

1 个答案:

答案 0 :(得分: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;
}