c++ - 获得向后插入器并回退到任何插入器的惯用方法是什么?

标签 c++ templates c++-standard-library idioms inserter

我想将元素插入到 STL 容器中(其类型是模板参数)。如果容器允许 back_insertion,我想使用它,否则就使用任何插入器。

我想避免为此实现我自己的特征,我很确定必须有某种方式我可以说“如果可能的话实例化一个 back_inserter,否则实例化一个插入器”。

我该怎么做?

最佳答案

您可以使用带有重载解析的尾随返回类型来执行如下操作:

namespace impl
{
   // preferred overload: if we can push_back a Container::value_type
   template <class Container>
   auto generic_inserter(Container& c, int)
       -> decltype(void(c.push_back(std::declval<typename Container::value_type>())),
                   std::back_inserter(c))
    {
        return std::back_inserter(c);
    }

    // fallback if we can't
    template <Container>
    auto generic_inserter(Container& c, ...)
    {
        return std::inserter(c, c.end());
    }
}

template <class Container>
auto generic_inserter(Container& c)
{
    return impl::generic_inserter(c, 0);
}

在 C++11 中,只需将 auto 返回类型替换为 decltype(body-of-function)

关于c++ - 获得向后插入器并回退到任何插入器的惯用方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36914066/

相关文章:

c++ - 为什么 std::stof、std::stod 和 std::stold 处理带有异常的错误?

c++ - 模板和可执行文件

c++ - 在 std::for_each 中返回 std::move(f)

类错误的 C++ vector

堆栈对象的 C++ 继承

c++ - 使用 dlopen 加载动态库时抛出 undefined symbol

c++ - 为什么我的代码返回错误的平方值? C++

c++ - c++-通过抽象模板基类接口(interface)指针访问派生类方法,而接口(interface)中没有显式类型

c++ - std::is_class 的这种实现是如何工作的?

c++ - 分配但不使用分配器的标准库设施