gpt4 book ai didi

c++ - 带有 const 后缀的自动解析成员函数

转载 作者:搜寻专家 更新时间:2023-10-31 00:50:30 24 4
gpt4 key购买 nike

在我的类(class)中,我有 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<std::set<int> > 来实例化其中一个或 SmartContainerHandler<std::vector<int> >

我的问题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 = &std::set<int>::lower_bound )

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

最佳答案

您可以在这里简单地依赖表达式 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;
}

第一个foo_impl如果 std::declval<Q&>().lower_bound(k) 过载将被丢弃不是有效的表达式。

关于c++ - 带有 const 后缀的自动解析成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57359894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com