停止使用std::bind
。这是一堆随机的特征和怪癖。
今天的怪事是std::bind
将接受无限数量的参数并丢弃任何额外的参数。明天你可能会遇到这样一个事实:std::bind
结果到std::bind
会施展奇怪的魔法。
std::bind
被移植到boost
同时 lambda 也被添加到该语言中。 Lambda 几乎解决了所有问题bind
语法同样清晰,并且没有无数的怪癖bind
确实如此,尤其是在 C++14 之后auto
lambda 可用。 (大多数 C++11 编译器也支持auto
拉姆达)。
您可以编写函数,以便在它们同时适用时,其中一个或另一个成为首选重载。但这样做会给你的界面增加一堆噪音,在这种情况下,你想要这种偏好的唯一原因是因为std::bind
正在做一些愚蠢的事情。
围绕设计不佳的一点进行工程std
图书馆不值得。只需停止使用设计不佳的部分即可std
库,或在使用时显式转换。
如果失败,请执行以下操作:
template <class T, class F,
std::enable_if_t<
std::is_convertible<
std::result_of_t<std::decay_t<F> const&(Value<T> const&)>,
bool
>{}, int
> = 0
>
void Add(Value<T> &value, F&& f)
{
// do pass f Value<T>
}
template <class T, class F,
std::enable_if_t<
!std::is_convertible<
std::result_of_t<std::decay_t<F> const&(Value<T> const&)>,
bool
>{}
&& std::is_convertible<
std::result_of_t<std::decay_t<F> const&()>,
bool
>{}, int
> = 0
>
void Add(Value<T> &value, F&& f)
{
// do not pass f Value<T>
}
我们对您想要使用的两个重载中的哪一个进行了一些令人讨厌的 SFINAE 检测,并且明确更喜欢其中一个。
这是不值得的。