当前位置:  开发笔记 > 编程语言 > 正文

什么是支持"部分专业化"的其他语言?

如何解决《什么是支持"部分专业化"的其他语言?》经验,为你挑选了1个好方法。

部分模板专业化是C++中通用编程最重要的概念之一.例如:实现通用交换功能:

template 
void swap(T &x, T &y) {
  const T tmp = x;
  y = x;
  x = tmp;
}

专门用于支持O(1)交换的向量:

template 
void swap(vector &x, vector &y) { x.swap(y); }

因此,当您在泛型函数中调用swap(x,y)时,总能获得最佳性能;

非常感谢,如果您可以在替代语言中发布等效语言(或语言的部分专业化的规范示例,如果语言不支持交换概念).

编辑:所以看起来许多回答/评论的人真的不知道什么是部分专业化,而且通用交换示例似乎妨碍了某些人的理解.一个更一般的例子是:

template 
void foo(T x) { generic_foo(x); }

部分专业化将是:

template 
void foo(vector x) { partially_specialized_algo_for_vector(x); }

完整的专业化将是:

void foo(vector bitmap) { special_algo_for_bitmap(bitmap); }

为什么这很重要?因为你可以在泛型函数中调用foo(任何东西):

template 
void bar(T x) {
  // stuff...
  foo(x);
  // more stuff...
}

并在编译时获得最合适的实现.这是C++实现抽象的一种方式,具有最小的性能损失.

希望它有助于清除"部分专业化"的概念.在某种程度上,这就是C++如何进行类型模式匹配而不需要显式模式匹配语法(比如Ocaml/F#中的match关键字),这有时会妨碍泛型编程.



1> quark..:

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;
}

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有