部分模板专业化是C++中通用编程最重要的概念之一.例如:实现通用交换功能:
templatevoid swap(T &x, T &y) { const T tmp = x; y = x; x = tmp; }
专门用于支持O(1)交换的向量:
templatevoid swap(vector &x, vector &y) { x.swap(y); }
因此,当您在泛型函数中调用swap(x,y)时,总能获得最佳性能;
非常感谢,如果您可以在替代语言中发布等效语言(或语言的部分专业化的规范示例,如果语言不支持交换概念).
编辑:所以看起来许多回答/评论的人真的不知道什么是部分专业化,而且通用交换示例似乎妨碍了某些人的理解.一个更一般的例子是:
templatevoid foo(T x) { generic_foo(x); }
部分专业化将是:
templatevoid foo(vector x) { partially_specialized_algo_for_vector(x); }
完整的专业化将是:
void foo(vectorbitmap) { special_algo_for_bitmap(bitmap); }
为什么这很重要?因为你可以在泛型函数中调用foo(任何东西):
templatevoid bar(T x) { // stuff... foo(x); // more stuff... }
并在编译时获得最合适的实现.这是C++实现抽象的一种方式,具有最小的性能损失.
希望它有助于清除"部分专业化"的概念.在某种程度上,这就是C++如何进行类型模式匹配而不需要显式模式匹配语法(比如Ocaml/F#中的match关键字),这有时会妨碍泛型编程.
D支持部分专业化:
语言概述
模板功能比较(使用C ++ 98和0x)。
(在以上链接中搜索“部分”)。
特别是第二个链接将为您提供模板特化功能的非常详细的细分,不仅在D中,而且在C ++中。
这是D的D特定示例swap
。它应该打印出Thing
该类专用交换的消息。
import std.stdio; // for writefln // Class with swap method class Thing(T) { public: this(T thing) { this.thing = thing; } // Implementation is the same as generic swap, but it will be called instead. void swap(Thing that) { const T tmp = this.thing; this.thing = that.thing; that.thing = tmp; } public: T thing; } // Swap generic function void swap(T)(ref T lhs, ref T rhs) { writefln("Generic swap."); const T tmp = lhs; lhs = rhs; rhs = tmp; } void swap(T : Thing!(U))(ref T lhs, ref T rhs) { writefln("Specialized swap method for Things."); lhs.swap(rhs); } // Test case int main() { auto v1 = new Thing!(int)(10); auto v2 = new Thing!(int)(20); assert (v1.thing == 10); assert (v2.thing == 20); swap(v1, v2); assert (v1.thing == 20); assert (v2.thing == 10); return 0; }