Проблема
Предположим, что есть функция func
, которая принимает любой контейнер в форме Container<Type, N, Args...>
(то есть контейнер, который принимает в качестве первого аргумента шаблона тип, а в качестве второго — std::size_t
, определяющий количество аргументов в контейнере) и возвращает свой i
th элемент тогда и только тогда, когда 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];
}
чтобы определить единую версию этой функции и сделать так, чтобы она работала как для Container<Type, N, Args...>&
, так и для const Container<Type, N, Args...>&
?