他の任意のテンプレートをパラメーターとして取り、テンプレート名と適切に一致させることができるテンプレート関数を作成できるかどうか疑問に思っていました (つまり、結果のクラスだけではありません)。私が働くことを知っているのはこれです:
template<template<typename ...> class TemplateT, typename... TemplateP>
void f(const TemplateT<TemplateP...>& param);
たとえば、f(std::vector<int>())
orには一致しますf(std::list<int>())
が、 には機能しませんf(std::array<int, 3>())
。2 番目のパラメーターは asize_t
で型がないためです。
今、私は次のようなクレイジーなことをすることができると思います:
template<template<typename ...> class TemplateT, size... Sizes, typename... TemplateP>
void f(const TemplateT<Sizes..., TemplateP...>& param);
コンパイラがTemplateP
省略記号またはSizes
省略記号のいずれかが空になるように適切に導出することを期待しています。しかし、醜いだけでなく、型またはsize_t
パラメーターのいずれかを取るテンプレートでも機能します。bool
たとえば、パラメーターを含む任意のテンプレートとはまだ一致しません。
オーバーロードを使用したアプローチについても同じことが言えます。
template<template<typename ...> class TemplateT, typename... TemplateP>
void f(const TemplateT<TemplateP...>& param);
template<template<typename ...> class TemplateT, size... Sizes>
void f(const TemplateT<Sizes...>& param);
size_t
さらに、とを混在させたい場合、このようなアプローチは機能しませんtypenames
。したがって、何かに一致するために必要なものは次のようなものです。省略記号で許可されるものにまったく制約はありません。
template<template<...> class TemplateT, ... Anything>
void f(const TemplateT<Anything...>& param);
その構文は機能しませんが、このようなものを定義する他の構文があるのでしょうか?
これは主に、最初のパラメーターが常に固定されているさまざまなテンプレートがあり、戻り値の型に基づいて変更し、他のすべてを保持したい場合、言語で何が可能か疑問に思っています。実際に使用できる可能性があると思いました. このようなもの:
template<
template<typename ValueT, ...> class TemplateT,
... Anything,
typename ValueT,
typename ResultT = decltype(some_operation_on_value_t(std::declval<ValueT>())>
TemplateT<ResultT, Anything...> f(const TemplateT<ValueT, Anything...>& in);
では、パターン マッチングを使用して、これを完全に一般的な方法で機能させる方法はありますか?
これは純粋な思考実験ではありません。なぜなら、私が立ち往生したユースケースは、コンテナーで動作し、不変の結果コンテナーを暗黙的に構築する純粋な機能プリミティブを作成することだったからです。結果コンテナーのデータ型が異なる場合、コンテナーが操作する型を知る必要があるため、コンテナーの唯一の要件は、テンプレートの最初のパラメーターが入力型である必要があるため、別の型に置き換えることができることです。結果の出力型ですが、コードはその後に続くテンプレート引数を無視する必要があり、それが型か値かを気にする必要はありません。