gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:22:33 25 4
gpt4 key购买 nike

我有以下情况,不知道我的做法对不对。我正在从事具有以下结构的项目:

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{..}

我要实现的目标:

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

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

这个逻辑对吗?谢谢!

最佳答案

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

首先,int 没有任何实际意义。我假设可能值的数量及其含义应该限制在一个特定的集合中,因此使用 enum (如果是 C++,则更好的是 enum class 11 可用)似乎更合适。您仍然可以像使用 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 的解决方案相比,它还会使您更加灵活,因为您可以稍后添加任意数量的策略并为每个策略指定一个描述性名称。

关于c++ - 用于逻辑拆分的非类型模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30667905/

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