問題
func
フォーム内の任意のコンテナー(Container<Type, N, Args...>
つまり、最初のテンプレート引数として型を取り、2 番目として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...>&
?の両方で機能します。