用于逻辑拆分的非类型模板

Posted

技术标签:

【中文标题】用于逻辑拆分的非类型模板【英文标题】:Non-type templates for logic splitting 【发布时间】:2015-08-20 11:38:43 【问题描述】:

我有以下情况,不知道我的做法对不对。我正在开发一个具有以下结构的项目:

class Filesystem 
public:
      Filesystem(Profile* profile);
      OpenFile(const std::string& file,OpenFileCallback);
      ReadFile(int file_handle,Buffer* buffer,ulong offset,ulong length);
protected:
    DiskRouter* disk_router_;
...


// --- implementation ---
Filesystem::Filesystem(Profile* profile) 
    :disk_router_(Disk_Router::Get(profile))

此类使用 Operation 抽象来运行 OpenFile 操作、ReadFile 操作等。这些操作被发送到负责处理相关文件系统类型的路由器。

class Operation 
public:
    Operation(Disk_Router* router) 
    

我想使用一个非类型参数来选择目标路由器和一个目标策略来在路由器之间进行选择。基本上代码是可重用的,我不想改变一个好的实现,如果有什么改变可用于所有逻辑。 比如:

template <int DESTINATION>
class Filesystem
 ...
protected:
  Destination_Policy<DESTINATION>::DestinationType router_type;

// ----- implementation
template <int DESTINATION>
Filesystem<DESTINATION>::Filesystem(Profile* profile)
      :disk_router_(Destination_Policy<DESTINATION>::Get(profile)) 

操作将变为:

template <class Destination>
class Operation..

我想要达到的目标:

我不需要描述路由器的通用接口。它们可以独立变化

如果需要,我可以根据非类型专门化某些方法

这个逻辑正确吗? 谢谢!

【问题讨论】:

【参考方案1】:

想到了两件事,但是由于您的问题只显示了您的代码的一小部分,因此只有您可以判断它们是否适用:

首先,int 没有任何实际意义。我假设可能值的数量及其含义应限于特定的集合,因此使用enum(如果C++11 可用,则使用enum class 更好)似乎更合适。您仍然可以像使用 int 一样进行专业化,只是您的代码将变得更具可读性且不易出错。

但是第二件事,恕我直言,真正的问题是,你为什么需要非类型参数?看起来您可以直接传递策略类型:

template <typename DestinationPolicy>
class Filesystem
 ...
protected:
  typename DestinationPolicy::DestinationType disk_router_;

// ----- implementation
template <typename DestinationPolicy>
Filesystem<DestinationPolicy>::Filesystem(Profile* profile)
      :disk_router_(DestinationPolicy::Get(profile)) 

等等

如果您的大多数策略最终看起来几乎相同,请为它们创建一个基类,并仅覆盖真正策略所需的内容。与基于 enum 的解决方案相比,它还会让您更加灵活,因为您可以稍后添加任意数量的策略并为每个策略指定一个描述性名称。

【讨论】:

是的,我使用的是枚举,但直接使用目标策略更有意义。我仍在分析遵循接口的 DiskRouter 适配器是否不适用。但这意味着更多的代码更改和一些我不满意的接口限制。

以上是关于用于逻辑拆分的非类型模板的主要内容,如果未能解决你的问题,请参考以下文章

R字符串拆分函数(strsplit)中的非字符参数

如何使用 Kickstart Spring Boot GraphQL 在逻辑上拆分我的 GraphQL 架构和解析器

Anylogic,将代理拆分为多种不同的代理类型

如何在 django 模板中拆分字符串?

python面试之分布式

拆分可变参数模板参数