この質問に適切なタイトルを思いつくのは難しいです。私が本当に必要としているのは、1 つのパラメーターの代わりに異なる数の引数をテンプレート パラメーターに提供できるようにすることです。あまり意味がないので、理由を説明します。
template < typename T, template <typename,typename> class Policy = default_policy >
struct policy_based : Policy<T, policy_based<T,Policy> >
{
// inherits R Policy::fun(arg0, arg1, arg2,...,argn)
};
// normal use:
policy_base<type_a> instance;
// abnormal use:
template < typename PolicyBased > // No T since T is always the same when you use this
struct custom_policy {};
policy_base<type_b,custom_policy> instance;
多くの異常な使用では、ポリシーは 1 つの型 T に基づいており、実際には T でパラメーター化できないため、T をパラメーターとして使用しても意味がありません。デフォルトを含む他の用途では、ポリシーは任意の T で意味をなすことができます。
いくつかのアイデアがありますが、どれも本当にお気に入りではありません。ポリシーの代わりにコンポジションを使用して、より良い答えがあると思いましたが、fun() が実際にはクラス自体にはない追加情報を必要とするこのケースがあることに気付きました。
このばかげた構造をリファクタリングしたのはこれで 3 回目で、統合しようとしているカスタム バージョンがかなりあります。今回は釣りをするだけでなく、何かを突き止めて、今回はうまくいくことを願っています。だから私はちょうど今、誰かが私が神を変えるほど感銘を受ける何かを持っていることを期待してアイデアを釣り上げています. 誰でも良いアイデアがありますか?
編集: default_policy のテンプレートに基づいてポリシーの定義から T を取得しない理由を自問するかもしれません。その理由は、default_policy が実際には一部の型 T に特化しているためです。質問をしてから、必要なものを思いついたので、それについて説明しますが、他のアイデアを使用することもできます。
template < typename T >
struct default_policy;
template < typename T, template < typename > class Policy = default_policy >
struct test : Policy<test<T,Policy>>
{};
template < typename T >
struct default_policy< test<T, default_policy> >
{
void f() {}
};
template < >
struct default_policy< test<int, default_policy> >
{
void f(int) {}
};
編集:まだいじっています。default_policy が「test」と永続的に結合され、以下に提案されている複数のテンプレートなど、他の方法で再利用できなかったため、上記はあまり好きではありませんでした。また、まったくスケーリングせず、少なくとも「テスト」が持つ限り、パラメーターのリストが必要です。これまでのところ機能していると思われる別のアプローチを見つけるまで、失敗したいくつかの異なるアプローチを試しました。
template < typename T >
struct default_policy;
template < typename T, template < typename > class Policy = default_policy >
struct test : Policy<test<T,Policy>>
{};
template < typename PolicyBased >
struct fetch_t;
template < typename PolicyBased, typename T > struct default_policy_base;
template < typename PolicyBased >
struct default_policy : default_policy_base<PolicyBased, typename fetch_t<PolicyBased>::type> {};
template < typename T, template < typename > class Policy >
struct fetch_t< test<T,Policy> > { typedef T type; };
template < typename PolicyBased, typename T >
struct default_policy_base
{
void f() {}
};
template < typename PolicyBased >
struct default_policy_base<PolicyBased,int>
{
void f(int) {}
};