【问题标题】:automatic resolve member function with const postfix使用 const 后缀自动解析成员函数
【发布时间】:2019-08-05 13:43:21
【问题描述】:

在我的课堂上,我有 2 种算法应该应用,具体取决于容器是否支持 lower_bound

template <class T>
class SmartContainerHandler{
....
template <class Q=T>
typename std::enable_if< std::is_member_function_pointer<decltype(&Q::lower_bound)>::value >::type
foo_impl(int k, double _ = 0)
{
    auto r = _t.lower_bound(k);
    std::cout << "has lower_bound" << (r == _t.end() ? -1 : *r) << std::endl;
}
template <class Q=T>
typename std::enable_if<! std::is_member_function_pointer<decltype(&Q::lower_bound)>::value >::type
foo_impl(int k)
{
    std::cout << << "no lower_bound, just a key:" << k <<  std:: endl;
}

例如,我想使用SmartContainerHandler&lt;std::set&lt;int&gt; &gt;SmartContainerHandler&lt;std::vector&lt;int&gt; &gt; 进行实例化

lower_bound 有 2 个签名我的问题

template< class K > iterator lower_bound(const K& x);
template< class K > const_iterator lower_bound(const K& x) const;

(尝试编译没有成功auto m = &amp;std::set&lt;int&gt;::lower_bound

在我的特殊情况下,我不关心 const 签名,但为了更通用的问题:如果提供了 2 个或更多签名,如何检查方法是否存在?

【问题讨论】:

  • 你想要一种方法来区分无重载/一个重载/两个重载(例如,const / non-const)?或者只是一种区分无重载/一个或多个重载的方法?
  • @Holt 对我来说最好的——让编译器提供最好的重载。但我从表达式&amp;Q::lower_bound 了解到这是不可能的。所以 const/non-const 是指定正确选择的好方法。

标签: c++ c++11 stl


【解决方案1】:

您可以在这里简单地依赖 表达式 SFINAE,例如:

template <class Q=T>
auto foo_impl(int k, double _ = 0)
    -> decltype(std::declval<Q&>().lower_bound(k), void())
{
    auto r = _t.lower_bound(k);
    std::cout << "has lower_bound" << (r == _t.end() ? -1 : *r) << std::endl;
}

void foo_impl(int k, ...)
{
    std::cout << << "no lower_bound, just a key:" << k <<  std:: endl;
}

如果std::declval&lt;Q&amp;&gt;().lower_bound(k) 不是有效表达式,则将丢弃第一个foo_impl 重载。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 2011-06-04
  • 2021-11-14
  • 2016-08-17
  • 2015-07-19
  • 2015-06-13
  • 1970-01-01
相关资源
最近更新 更多