Проблема
Предположим, что функция func
принимает любой контейнер в форме Container<Type, N, Args...>
(то есть контейнер, который принимает в качестве первого аргумента шаблона тип, а второй - std::size_t
, определяющий, сколько аргументов присутствует в контейнере) и возвращает его i
-й элемент тогда и только тогда, когда N
находится между 40
и 42
.
Примером такого контейнера является std::array
.
Моя первая версия функции будет выглядеть так:
template
< template<class, std::size_t, class...> class Container
, class Type
, std::size_t N
, class... Args >
auto func(std::size_t i, Container<Type, N, Args...>& container) -> decltype(container[0]) {
static_assert(N >= 40 && N <= 42, "bla bla bla");
return container[i];
}
а затем мне понадобится перегрузка const
:
template
< template<class, std::size_t, class...> class Container
, class Type
, std::size_t N
, class... Args >
auto func(std::size_t i, const Container<Type, N, Args...>& container) -> decltype(container[0]) {
static_assert(N >= 40 && N <= 42, "bla bla bla");
return container[i];
}
Вопрос
Можно ли определить что-то вроде этого (это не сработает, потому что это не универсальная ссылка):
template
< template<class, std::size_t, class...> class Container
, class Type
, std::size_t N
, class... Args >
auto func(std::size_t i, Container<Type, N, Args...>&& container) -> decltype(container[0]) {
// ^^
static_assert(N >= 40 && N <= 42, "bla bla bla");
return container[i];
}
чтобы определить одну версию этой функции, и make работает как для Container<Type, N, Args...>&
, так и const Container<Type, N, Args...>&
?