Я хочу вставить элементы в контейнер 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)
,
Других решений пока нет …