c – 基于策略的设计和默认设置

很难为这个问题找到一个好头衔.我真正需要的是能够提供具有不同数量的参数的模板参数来代替单个参数.没有多大意义,所以我会说清楚原因:

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模板中的策略定义中检索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”结合,因此无法在其他方法中重复使用,例如下面建议使用多个模板.它也根本没有扩展,并且至少只要“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) {}
};

最佳答案 我有类似的问题,但没有找到理想的答案.据我所知,C对可变数量的模板参数没有优雅的支持,所以你必须通过在另一个类中“包装”额外的参数来绕过它;

policy_base< twoArgs<part1, part2> >

你可以通过为twoArgs制作typedef来实现这一点,但在这个基本情况下不是很多. (请记住,您可以通过在模板化类中使用成员typedef来“执行”模板化的typedef.)

或者通过对核心模板进行许多不同的声明,使用不同的args;

template< typename T1 > struct base {...}
template< typename T1, typename t2 > struct base {...}
//etc
点赞