我有类似于Passing different lambdas to function template in c++的问题,但现在使用由std::bind
创建的包装来代替lambda表达式。将std :: bind的结果传递给std :: function“overloads”
我有方法Add
两个重载采取std::function
不同的形式:
template<typename T>
struct Value
{
T value;
};
template <typename T>
void Add(Value<T> &value, function<bool()> predicate)
{
}
template <typename T>
void Add(Value<T> &value, block_deduction<function<bool(const Value<T> &)>> predicate)
{
}
现在,这正常工作与lambda表达式,但未能与绑定std::bind
函子:
struct Predicates
{
bool Predicate0() { return true; }
bool Predicate1(const Value<int> &) { return true; }
};
Predicates p;
Add(i, std::bind(&Predicates::Predicate0, &p));
失败
错误C2668:'添加':模糊呼叫overloa DED功能
和
Add(i, std::bind(&Predicates::Predicate1, &p, _1));
失败,静态断言(的Visual C++ 2015年,更新3):
元组索引越界
是否有办法使它与lambda表达式和绑定函子一起工作?我会考虑使用SFINAE来启用基于is_bindable_expression
的单个过载并检查参数类型,但我没有把它放在一起。
'std :: bind(&Predicates :: Predicate0,&p)()'和'std :: bind(&Predicates :: Predicate0,&p)(值为 {})'都是有效的。 (在后一种情况下,参数Value {}'被忽略。)这是'std :: bind'的一个特性。 –
cpplearner
您滥用超载。满足属性的类型“可以用此参数调用它的实例”或“可以用另一个参数调用它的实例”的类型是非空的。 – milleniumbug