gpt4 book ai didi

c++ - 我们如何使用 boost::mpl 实现 Builder 设计模式?

转载 作者:行者123 更新时间:2023-11-28 07:54:30 25 4
gpt4 key购买 nike

<分区>

我有三个类,它们遵循相同的概念类,但在用于存储的底层数据结构上有所不同。作为示例,请使用下面给出的三个类。

template< typename T >
class A{
std::vector<T> storage;
//etc
};

template<>
class A<bool>{
boost::dynamic_bitset<> storage;
//etc
};

class B{
ComplexUDT storage;
//etc
};

A 类是使用 vector 的通用类。避免使用 vector<bool>提供了使用 boost::dynamic_bitset<> 的 A 类完全特化作为底层存储。最后,B 类使用用户定义的数据类型作为存储。上面的设计导致了很多代码的冗余。为了消除这种冗余,我想到了使用 boost::mpl

template< typename T >
class vec_impl{
std::vector< T > storage;
//impl of methods
};

class bitset_impl{
boost::dynamic_bitset<> storage;
//impl of methods
};

class udt_impl{
ComplexUDT storage;
//impl of methods
};

template<Derived,Storage>
class main_class_gen{
typedef typename boost::mpl::if_<is_complexudt<Storage>,
udt_impl,
typename boost::mpl::if_< is_bool<Storage>,
bitset_impl,
vec_impl<Storage> >::type >::type type
};

class main_class:
public main_class_gen< main_class<Storage>,Storage >::type{
//impl. of methods
};

由于 boost::dynamic_bitset 不对 Container 建模,因此某些类方法的实现与 vector 类不同。 complexUDT 基类与其他两个类有很大不同,但确实有一些共同的小代码段。但是目前的重构方式仍然会导致代码冗余。概念类中提到的所有方法都必须在每个实现中实现。

所以我的问题有两个方面。

  1. 我们如何使用 boost::mpl 实现构建器设计模式?
  2. CRTP 对上述示例有任何帮助吗?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com