使用lambda表达式

时间:2015-05-17 18:56:05

标签: c++ lambda functor default-arguments

我试图为参与者定义一个默认值,该参数是一个仿函数。但我得到了这个错误:

注意:候选模板被忽略:无法推断模板参数       '小样'

这是我的功能定义:

template <typename RAIterator, typename Comp> 
void somefunction(RAIterator beg, RAIterator end, Comp comp=
[](const typename iterator_traits<RAIterator>::value_type& a, 
   const typename iterator_traits<RAIterator>::value_type& b)->bool
   {return b<a?true:false;}){
   //the content of the "somefunction"
}

我想知道我是否可以这样做,如果是这样,那部分我做错了。谢谢。

1 个答案:

答案 0 :(得分:2)

您无法为模板参数提供默认参数,而无需用户明确指定Comp的类型,这对于此用例非常不方便。你可以做两件事之一。您可以提供一个默认传递的重载:

template <typename RAIterator, typename Comp> 
void somefunction(RAIterator beg, RAIterator end, Comp comp ) { ... }

template <typename RAIterator>
void somefunction(RAIterator beg, RAIterator end) {
    somefunction(beg, end, std::less<typename std::iterator_traits<RAIterator>::value_type>{});
}

或者,您可以将comp的类型设为非推导上下文,这样可以添加默认参数,但在这种情况下会增加可能的开销,因为我们将其设为{{1 }}:

std::function