c++ - 模板特化还是条件表达式?

标签 c++ templates specialization open-closed-principle

我正在深入研究一个新项目,我用一堆模板和它们的特化来解决这个问题。现在,在一天没有编程之后,我发现自己在问是否真的值得多写几行代码。

问题是:特化的优势是什么?

这是:

template <int i> class A {};
template <> class A <1> { void foo() {/* something */}  };
template <> class A <2> { void foo() {/* something else*/}  };
template <> class A <3> { void foo() {/* even different*/}  };

在任何方面都比

更好(执行速度更快)
template <int i> class A { 
   void foo() {
      if (i==1) {/* something */}
      else if (i==2) {/* something else*/}
      else if (i==3) {/* even different*/}
   }
};

?

编辑:

该代码是供其他人使用的库的一部分。 我使用的是 gcc 4.6.3,但最终代码将用于不同的编译器。

编辑:

这两段代码使用 gcc 4.6.3 生成相同的二进制文件。我无法测试完整案例,因为我的实际代码远非可用。这似乎真的是一个原则问题、通用性、可重用性、可维护性等......

最佳答案

速度不是这里的主要问题,但可扩展性才是。

特化的优势在于,您可以让代码的客户更轻松地添加新的 foo() 重载。假设您稍后决定为 i=4 添加新行为:在第一种方法中,您只需添加一个新的特化;在第二个版本中,您需要修改函数foo()。如果您以二进制形式发布您的库,客户将不会高兴。

特化方法对第二种方法的偏好是开放/封闭原则的体现:代码应该对扩展开放,对修改关闭。

关于c++ - 模板特化还是条件表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11285032/

相关文章:

c++ - 使用 GNU 科学库 (GSL) 使用不均匀分布的点绘制 2D B 样条路径

c++ - 如何解析UTF-8中文字符串

c++ - 没有 ExecutionPolicy 的 std::transform 或 std::generate 可以并行吗?

c++ - 哪个编译器对于以下重载/特化行为是正确的?

c++ - 类模板成员特化

C++类模板特化问题

c++ - Visual Studio 2008 C++ - 远程调试 - "Could not load symbols"仅适用于主项目

c++ - 如何实现 "const"和 "non-const"重载而不重复代码?

c++ - CUDA内核模板实例化导致编译错误

django - 包含来自 django 模板的静态文件