热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用C++模板做代码设计的三类方法及代码——基于策略Policybaseddesign

列出了3个方法,还有很多衍生版本,总结如下:通过继承,与static有同样的使用接口继承:对代码改动最小:using,适用于对代码已经写好,但用于追加功能,修改功能的时候

http://en.wikipedia.org/wiki/Policy-based_design(第一分代码的来源)

这本书以前看过,是关于template 很好的书,关于policy-based wiki 用继承实现:

列出了3个方法,还有很多衍生版本,总结如下:

通过继承,与static 有同样的使用接口

继承:对代码改动最小:using ..., 适用于对代码已经写好,但用于追加功能,修改功能的时候

static: 代码改动较继承大,需要在每个修改的地方都加上类名,适用于:代码设计阶段。优点是代码清晰明了(相对其它,最清晰)

指针构造:功能最完善,适用于极其复杂的功能设计。扩展性强。缺点是,代码改动大,只能在代码设计阶段使用


#include "inheritance.h"
#include "static.h"
#include "pointer.h"
int main()
{
AAA::inheritance_t();
BBB::static_t();
CCC::pointer_t();
}
1.通过继承

#pragma once
#include
#include
namespace AAA{
template
class HelloWorld : private OutputPolicy, private LanguagePolicy
{
using OutputPolicy::print;
using LanguagePolicy::message;
public:
void run() const
{
print(message());
}
};
class OutputPolicyWriteToCout
{
protected:
template
void print(MessageType const &message) const
{
std::cout < }
};
class LanguagePolicyEnglish
{
protected:
std::string message() const
{
return "Hello, World!";
}
};
class LanguagePolicyGerman
{
protected:
std::string message() const
{
return "Hallo Welt!";
}
};
void inheritance_t()
{
/* Example 1 */
typedef HelloWorld HelloWorldEnglish;
HelloWorldEnglish hello_world;
hello_world.run(); // prints "Hello, World!"
#if 1
/* Example 2
* Does the same, but uses another language policy */
typedef HelloWorld HelloWorldGerman;
HelloWorldGerman hello_world2;
hello_world2.run(); // prints "Hallo Welt!"
#endif
}
}

便于查看

继承:对代码改动最小:using ..., 适用于对代码已经写好,但用于追加功能,修改功能的时候

static: 代码改动较继承大,需要在每个修改的地方都加上类名,适用于:代码设计阶段。优点是代码清晰明了(相对其它,最清晰)

指针构造:功能最完善,适用于极其复杂的功能设计。缺点是,代码改动大,只能在代码设计阶段使用


2.通过static函数

#pragma once
#include
#include
namespace BBB{
template
class HelloWorld
{
public:
// Behaviour method
static void run() /*const*/
{
OutputPolicy::print(LanguagePolicy::message());
}
};
class OutputPolicyWriteToCout
{
//protected:
public:
template
static void print(MessageType const &message) /*const*/
{
std::cout < }
};
class LanguagePolicyEnglish
{
//protected:
public:
static std::string message() /*const*/
{
return "Hello, World!";
}
};
class LanguagePolicyGerman
{
//protected:
public:
static std::string message() /*const*/
{
return "Hallo Welt!";
}
};
void static_t()
{
/* Example 1 */
typedef HelloWorld HelloWorldEnglish;
HelloWorldEnglish hello_world;
hello_world.run(); // prints "Hello, World!"
/* Example 2
* Does the same, but uses another language policy */
typedef HelloWorld HelloWorldGerman;
HelloWorldGerman hello_world2;
hello_world2.run(); // prints "Hallo Welt!"
}
}

便于查看

继承:对代码改动最小:using ..., 适用于对代码已经写好,但用于追加功能,修改功能的时候

static: 代码改动较继承大,需要在每个修改的地方都加上类名,适用于:代码设计阶段。优点是代码清晰明了(相对其它,最清晰)

指针构造:功能最完善,适用于极其复杂的功能设计。缺点是,代码改动大,只能在代码设计阶段使用


3.通过构造函数指针

//pointer.h

#pragma once
#include
#include
namespace CCC{
template
class HelloWorld
{
const OutputPolicy & _policy;
const LanguagePolicy & _lang;
public:
HelloWorld(const OutputPolicy& policy, const LanguagePolicy &lang)
:_policy(policy), _lang(lang)
{
}
void run() const
{
_policy.print(_lang.message());
}
};
class OutputPolicyWriteToCout
{
//protected:
public:
template
void print(MessageType const &message) const
{
std::cout < }
};
class LanguagePolicyEnglish
{
//protected:
public:
std::string message() const
{
return "Hello, World!";
}
};
class LanguagePolicyGerman
{
//protected:
public:
std::string message() const
{
return "Hallo Welt!";
}
};
void pointer_t()
{
/* Example 1 */
OutputPolicyWriteToCout out;
LanguagePolicyEnglish langEng;
LanguagePolicyGerman langGerm;
{
typedef HelloWorld HelloWorldEnglish;
HelloWorldEnglish outlang(out, langEng);
outlang.run();
}
/* Example 2
* Does the same, but uses another language policy */
{
typedef HelloWorld HelloWorldGerman;
HelloWorldGerman outlang(out, langGerm);
outlang.run();
}
}
}

便于查看

继承:对代码改动最小:using ..., 适用于对代码已经写好,但用于追加功能,修改功能的时候

static: 代码改动较继承大,需要在每个修改的地方都加上类名,适用于:代码设计阶段。优点是代码清晰明了(相对其它,最清晰)

指针构造:功能最完善,适用于极其复杂的功能设计。缺点是,代码改动大,只能在代码设计阶段使用


用C++ 模板做代码设计的三类方法及代码——基于策略Policy-based design,布布扣,bubuko.com


推荐阅读
  • 在多堆石子游戏中,通过分析Nim博弈策略,探讨了如何在限定时间和内存条件下实现最优解。本文详细研究了石子游戏中的数学原理和算法优化方法,旨在为参与者提供有效的策略指导。具体而言,文章讨论了不同堆数下的Nim值计算及其应用,帮助玩家在复杂的博弈环境中取得优势。 ... [详细]
  • 在BZOJ 2563中,阿狸与桃子进行了一场策略博弈游戏。该问题的时间限制为3秒,内存限制为128MB,目前已有97次提交记录。通过对游戏规则和策略的深入分析,本文探讨了双方在不同情况下的最优决策路径,并提出了高效的算法解决方案。 ... [详细]
  • C#中实现高效UDP数据传输技术
    C#中实现高效UDP数据传输技术 ... [详细]
  • 优化后的标题:数据网格视图(DataGridView)在应用程序中的高效应用与优化策略
    在应用程序中,数据网格视图(DataGridView)的高效应用与优化策略至关重要。本文探讨了多种优化方法,包括但不限于:1)通过合理的数据绑定提升性能;2)利用虚拟模式处理大量数据,减少内存占用;3)在格式化单元格内容时,推荐使用CellParsing事件,以确保数据的准确性和一致性。此外,还介绍了如何通过自定义列类型和优化渲染过程,进一步提升用户体验和系统响应速度。 ... [详细]
  • Java Web开发中的JSP:三大指令、九大隐式对象与动作标签详解
    在Java Web开发中,JSP(Java Server Pages)是一种重要的技术,用于构建动态网页。本文详细介绍了JSP的三大指令、九大隐式对象以及动作标签。三大指令包括页面指令、包含指令和标签库指令,它们分别用于设置页面属性、引入其他文件和定义自定义标签。九大隐式对象则涵盖了请求、响应、会话、应用上下文等关键组件,为开发者提供了便捷的操作接口。动作标签则通过预定义的动作来简化页面逻辑,提高开发效率。这些内容对于理解和掌握JSP技术具有重要意义。 ... [详细]
  • 本文探讨了提升项目效能与质量的综合优化策略。通过系统分析项目管理流程,结合先进的技术手段和管理方法,提出了多项具体措施,旨在提高项目的执行效率和最终交付质量。这些策略包括但不限于优化资源配置、加强团队协作、引入自动化工具以及实施持续改进机制,为项目成功提供了坚实的保障。 ... [详细]
  • 本研究提出了一种方法,用于判断两个数组中的元素是否相同,而不考虑其顺序。该方法通过检查数组中每个元素的出现次数来实现。具体实现如下:首先验证输入参数是否为数组,然后对两个数组进行排序并逐个比较元素。若所有元素均相等,则返回 `true`,否则返回 `false`。此方法适用于需要忽略顺序的数组比较场景。 ... [详细]
  • 如何在 Node.js 环境中将 CSV 数据转换为标准的 JSON 文件格式? ... [详细]
  • 题目链接:http://poj.org/problem?id=3083。题目描述:给定一个迷宫,其中 'S' 表示起点,'E' 表示终点,'#' 表示墙壁,'.' 表示可通行的道路。起点和终点均位于迷宫的边界上,并且保证存在唯一路径。任务是求从起点 'S' 到终点 'E' 的最短路径步数,且优先考虑向左转弯。通过深度优先搜索(DFS)和广度优先搜索(BFS)算法进行路径探索,分析两种方法的优劣及适用场景。 ... [详细]
  • 在基于.NET框架的分层架构实践中,为了实现各层之间的松散耦合,本文详细探讨了依赖注入(DI)和控制反转(IoC)容器的设计与实现。通过合理的依赖管理和对象创建,确保了各层之间的单向调用关系,从而提高了系统的可维护性和扩展性。此外,文章还介绍了几种常见的IoC容器实现方式及其应用场景,为开发者提供了实用的参考。 ... [详细]
  • 在Mac平台上通过终端操作完成MySQL的启动与彻底关闭——八步指南
    在Mac平台上,通过终端操作实现MySQL的启动与完全关闭,本文提供了一套详细的八步指南。首先,在Finder中使用快捷键进入 `/usr/local` 目录,找到并进入 `mysql` 文件夹。接着,右键选择该文件夹并从上下文菜单中打开终端。在终端中,输入并执行 `./scripts/mysql_install` 命令以开始安装或初始化过程。后续步骤将指导用户如何顺利启动和安全关闭MySQL服务,确保系统资源的有效管理。 ... [详细]
  • C++ STL 常见函数应用详解与实例解析
    本文详细解析了 C++ STL 中常见函数的应用,并通过具体实例进行说明。特别地,文章对迭代器(iterator)的概念进行了深入探讨,将其视为一种将迭代操作抽象化的工具,便于在不同容器间进行元素访问和操作。此外,还介绍了迭代器的基本类型、使用方法及其在算法中的应用,为读者提供了丰富的实践指导。 ... [详细]
  • 本文深入探讨了ASP.NET中ViewState、Cookie和Session三种状态管理技术的区别与应用场景。ViewState主要用于保存页面控件的状态信息,确保在多次往返服务器过程中数据的一致性;Cookie则存储在客户端,适用于保存少量用户偏好设置等非敏感信息;而Session则在服务器端存储数据,适合处理需要跨页面保持的数据。文章详细分析了这三种技术的工作原理及其优缺点,并提供了实际应用中的最佳实践建议。 ... [详细]
  • 大数据应用实例:电视收视率分析企业项目实操第二篇
    本文继续探讨大数据在电视收视率分析中的应用,详细介绍了如何在CentOS系统中进行防火墙管理。针对CentOS 6.5及更早版本,提供了具体的命令操作步骤,包括停止防火墙服务和禁用防火墙启动。此外,还深入讨论了这些操作对数据传输和系统安全的影响,为实际项目实施提供了宝贵的技术参考。 ... [详细]
  • Git基础操作指南:掌握必备技能
    掌握 Git 基础操作是每个开发者必备的技能。本文详细介绍了 Git 的基本命令和使用方法,包括初始化仓库、配置用户信息、添加文件、提交更改以及查看版本历史等关键步骤。通过这些操作,读者可以快速上手并高效管理代码版本。例如,使用 `git config --global user.name` 和 `git config --global user.email` 来设置全局用户名和邮箱,确保每次提交时都能正确标识提交者信息。 ... [详细]
author-avatar
林琳奇
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有