很难想出一个好标题的这个问题。我真正需要的是能够使用不同数量的参数提供模板参数来代替单个参数。不会使一个很大的意义,所以我就去了原因:政策设计,默认
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;
这笔交易,对于许多不正常的使用策略将基于一个单一类型的T,并不能真正参数化在T上,所以将T作为参数是没有意义的。对于其他用途,包括默认情况下,政策是有意义的任何T.
我有几个想法,但他们都不是真正的最爱。我认为我有一个更好的答案 - 使用组合而不是策略 - 但后来我意识到我有这种情况,fun()实际上需要额外的信息,类本身不会有。
这是像我重构这个愚蠢的结构,我已经得到了它不少定制版本的周围,我试图巩固第三次。我希望这次得到一些东西,而不是仅仅在周围钓鱼,希望这次有用。所以我现在只是在寻找想法,希望有人有些事情会让我印象深刻,因为我会改变神性。任何人都有一个好主意?
编辑:您可能会问自己,为什么我不只是基于模板的default_policy策略的定义检索吨。原因是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) {}
};
最初我不喜欢多重声明的想法,因为这样做的目的是整合许多相似但略有不同的对象来共享代码。尽管大部分复制/粘贴的东西都可以被拉下,但是有适当的基本分类;我不得不比最初预期的要多得多,但是... ...这个twoArgs的想法也很有趣,如果考虑命名参数,这个想法可能会更有用。谢谢。 +1 – 2010-05-25 22:01:14