函数对象作为模板参数
Function object as template parameter
template <typename elemType, typename Comp = less<elemType> >
class LessThanPred {
public:
LessThanPred(const elemType &val) : _val(val){}
bool operator()(const elemType &val) const
{ return Comp(val, _val); }
void val(const elemType &newval) { _val = newval; }
elemType val() const { return _val; }
private:
elemType _val;};
这是 Essential c++ 中的示例。 Comp
显然是一个函数对象 class 的名字。为什么我可以直接使用 Comp(val, _val)
?通常我认为我应该首先像这样定义一个函数对象:Comp comp
,然后调用 comp
而不是 Comp
.
代码按原样编译,因为模板成员仅在实例化时检查语义正确性。不过,该代码在语法上结构良好。但是,当您尝试实例化 LessThanPred<T>
的函数调用运算符时,您将遇到编译器错误。例如,对于 clang
(3.6.1) 的版本,我使用的是
less-than.cpp:8:18: error: no matching constructor for initialization of 'std::less<int>'
{ return Comp(val, _val); }
^ ~~~~~~~~~
less-than.cpp:17:25: note: in instantiation of member function 'LessThanPred<int, std::less<int> >::operator()' requested here
LessThanPred<int>(2)(1);
尝试使用函数时
LessThanPred<int>(2)(1)
template <typename elemType, typename Comp = less<elemType> >
class LessThanPred {
public:
LessThanPred(const elemType &val) : _val(val){}
bool operator()(const elemType &val) const
{ return Comp(val, _val); }
void val(const elemType &newval) { _val = newval; }
elemType val() const { return _val; }
private:
elemType _val;};
这是 Essential c++ 中的示例。 Comp
显然是一个函数对象 class 的名字。为什么我可以直接使用 Comp(val, _val)
?通常我认为我应该首先像这样定义一个函数对象:Comp comp
,然后调用 comp
而不是 Comp
.
代码按原样编译,因为模板成员仅在实例化时检查语义正确性。不过,该代码在语法上结构良好。但是,当您尝试实例化 LessThanPred<T>
的函数调用运算符时,您将遇到编译器错误。例如,对于 clang
(3.6.1) 的版本,我使用的是
less-than.cpp:8:18: error: no matching constructor for initialization of 'std::less<int>'
{ return Comp(val, _val); }
^ ~~~~~~~~~
less-than.cpp:17:25: note: in instantiation of member function 'LessThanPred<int, std::less<int> >::operator()' requested here
LessThanPred<int>(2)(1);
尝试使用函数时
LessThanPred<int>(2)(1)