Какой идиоматический способ получить обратную вставку с отступлением к любой вставке?

Я хочу вставить элементы в контейнер STL (тип которого является параметром шаблона). Если контейнер позволяет back_insertion, я хочу использовать это, в противном случае просто любой вставщик.

Я хотел бы избежать необходимости реализовывать свою собственную черту только для этого, я почти уверен, что должен быть какой-то способ сказать "создать экземпляр back_inserter, если это возможно, и вставщик в противном случае".

Как я могу это сделать?

1 ответ

Вы можете использовать конечный тип возврата с разрешением перегрузки, чтобы сделать что-то вроде:

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),

Другие вопросы по тегам