在§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;
}
答案 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;
}