【发布时间】:2016-11-11 12:17:10
【问题描述】:
我有类似于 Passing different lambdas to function template in c++ 的问题,但现在使用由 std::bind 而不是 lambdas 创建的包装器。
我有两个方法 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)
{
}
这现在适用于 lambdas,但与绑定 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:“添加”:对重载函数的模糊调用
和
Add(i, std::bind(&Predicates::Predicate1, &p, _1));
静态断言失败(Visual C++ 2015,更新 3):
元组索引超出范围
有没有办法让它与 lambdas 和绑定函子一起工作?我会考虑使用 SFINAE 来启用基于 is_bindable_expression 的单个重载并检查参数类型,但我没有把它放在一起。
【问题讨论】:
-
std::bind(&Predicates::Predicate0, &p)()和std::bind(&Predicates::Predicate0, &p)(Value<int>{})均有效。 (在后一种情况下,参数Value<int>{}被忽略。)这是std::bind的一个特性。 -
你在滥用超载。满足“可以用这个参数调用它的实例”或“可以用另一个参数调用它的实例”属性的类型的交集是非空的。
标签: c++ c++14 template-meta-programming sfinae