c++ - 基于策略的设计和默认值

标签 c++ policy-based-design

很难为这个问题想出一个好的标题。我真正需要的是能够提供具有不同数量参数的模板参数来代替单个参数。没有多大意义,所以我会解释一下原因:

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;

交易是对于许多异常使用,Policy 将基于单一类型 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”永久耦合,因此不能在其他方法中重复使用,例如下面建议的多个模板。它也根本无法扩展,并且至少需要与“测试”一样长的参数列表。尝试了几种不同的方法都失败了,直到我找到另一种到目前为止似乎有效的方法:

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 来稍微美化一下,但在这种基本情况下不是很多。 (请记住,您可以通过在模板化类中使用成员类型定义来“执行”模板化类型定义。)

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

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

关于c++ - 基于策略的设计和默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2908689/

相关文章:

c++ - 从托管程序集 (C#) 上的非托管进程( native C++)调用时 LoadLibrary() 的预期行为是什么

c++ - 如何使用类型列表

mixins - 如何通过类mixin实现基于策略的设计?

c++ - 通过引用传递派生类到以基类为参数的函数

c++ - 为模板特化初始化静态常量

c++ - Visual C++ 2010 fatal error C1083;没有权限

c++ - 如何在linux上安装lapack++

c++ - 特质和政策有什么区别?

c++ - 基于策略的设计中的模糊继承

c++ - 基于策略的类中的策略转换运算符与私有(private)析构函数