当前位置: 首页 > 知识库问答 >
问题:

将use语句应用于函数的返回类型,而不应用于整个命名空间

艾灿
2023-03-14

我试图创建一个函数,该函数接受一个底层容器,并基于对元素进行某些处理的自定义迭代器返回boost::iterator\u范围。

例如。

// The range class, templated on the underlying iterator type
template<class Iter> using CustomRange = boost::iterator_range<CustomIterator<Iter>>;

using std::begin;
template <class Container>
auto make_custom_range(Container& c) -> CustomRange<decltype(begin(c))> {
    using std::end;
    return make_custom_range_from_iterators(begin(c),end(c));
}

代码可以正常工作(为CustomIterator提供了合适的定义,并使\u custom\u range\u from\u iterators)。

我关心的是使用std::begin声明,我认为这将导致std::begin被导入到声明我的函数的整个命名空间中。我不喜欢在decltype中显式地使用std::begin,这样ADL就可以工作了(就像在这个问题中:依赖ADL来实现std::begin()和std::end()?)。

我想在C 14中,我可以在这里使用自动返回类型。是否有C 11解决方案?有没有一种方法可以让返回类型看到using声明,而不将其公开给整个命名空间?

共有2个答案

闽焕
2023-03-14

将所有内容放入另一个名称空间中,并在其中使用s。然后将您的新助手带到顶级命名空间中:

namespace details {
    using std::begin;
    using std::end;

    template <typename C>
    auto adl_begin(C&& c) -> decltype(begin(std::forward<C>(c))) {
        return begin(std::forward<C>(c));
    }

    template <typename C>
    auto adl_end(C&& c) -> decltype(end(std::forward<C>(c))) {
        return end(std::forward<C>(c));
    }
}

using details::adl_begin;
using details::adl_end;

template <typename C>
using adl_begin_t = decltype(adl_begin(std::declval<C>()));

template <typename C>
using adl_end_t = decltype(adl_end(std::declval<C>()));

在C 14中,您不需要尾部返回类型,但也需要对cbegin和cend执行相同的操作。这样一来,您就不必再记住让使用s,只需在任何地方使用adl\uu*方法即可:

template <class Container>
CustomRange<adl_begin_t<Container&>> make_custom_range(Container& c) {
    return make_custom_range_from_iterators(adl_begin(c), adl_end(c));
}

崔高远
2023-03-14

将using声明放在单独的命名空间中:

namespace adl_helper
{
    using std::begin;

    template <typename T>
    auto adl_begin(T&& t) -> decltype(begin(std::forward<T>(t)));  
}

template <class Container>
auto make_custom_range(Container& c)
    -> CustomRange<decltype(adl_helper::adl_begin(c))>
//                          ~~~~~~~~~~~~~~~~~~~~^
{
    using std::begin;
    using std::end;
    return make_custom_range_from_iterators(begin(c),end(c));
}

演示

 类似资料:
  • 我有一些实现了一个不推荐使用的接口的遗留代码。这个特定组件很快就会被弃用并自行删除,因此重构以解决编译器警告的根本原因是没有意义的。相反,我想抑制它。然而,我不希望抑制的范围是整个类。 代码最初是: DeprecatedBaz是一个被标记为@Deprecated的接口,是第三方框架,这意味着我无法删除@Deprecated。我不想对整个班级发表警告,但不想发表反对意见。基本上我想写: 然而,这是无

  • 问题内容: 我正在尝试转换DataFrame,以便将某些行复制给定的次数。例如: 应该转换为: 这与使用count函数进行聚合相反。有没有一种简单的方法可以在熊猫中实现(不使用for循环或列表推导)? 一种可能是允许函数返回多行(的类似方法)。但是,我认为现在在大熊猫中是不可能的。 问题答案: 您可以使用groupby: 所以你得到 您可以根据需要固定结果的索引

  • 我想在spring boot中,当响应对象对于每个响应自动为null时返回404。 我需要建议。 我不想检查控制器中的对象是否为null。

  • 我有以下函数(一个以列作为输入的热编码函数)。我基本上想把它应用到我的数据框中的一列,但似乎不明白出了什么问题。 猜我怎么称呼它有问题?

  • 我得到了下面的代码,使用数组来查找一些prim数。然而,当试图编译我的用户类PalindromeArrayUser时,它说——“类中的构造函数不能应用于给定的类型” 要求:int。找到:没有论点。原因:实际参数和正式参数列表的长度不同。 但是,我已经向构造器传递了一个int值(与我的蓝图中设计的方式相同)。我不太明白问题来自哪里。谢谢。 这是我的两节课 而这就是我的用户类问题的来源。上面的类编译良

  • 在问我的问题之前,我想把一些事情说清楚。首先,我是Java和编程的新手。第二,这是我的第一个帖子,所以如果我做错了什么,请宽容对待我。最后,我不想要任何具体的解决办法,我的任务在任何回应这篇文章。这些问题要我来解决。我想要的是一个解释,为什么我的测试代码不能编译/运行。为了更好地理解这个问题,我将粘贴赋值信息,然后是给定的驱动程序类,然后是驱动程序类访问的我的类代码。我的编译器错误显示在标题中,但