相当于C ++ for Rust中特定模板的使用

时间:2017-12-06 13:27:16

标签: templates rust

Rust中是否有一个功能可以实现这样的功能? 据我所知,Rust的通用函数不可能实现这一点,因为它们只适用于数据类型,而不适用于值。

#include <iostream>

template<int T>
int foo(int a)
{
  return -1;
}
template<>
int foo<2>(int a)
{
  return a*a;
}
template<>
int foo<3>(int a)
{
  return a*a*a;
}

int main()
{
  std::cout << "foo<1>(3): "<<foo<1>(3) << std::endl;
  std::cout << "foo<2>(3): "<<foo<2>(3) << std::endl;
  std::cout << "foo<3>(3): "<<foo<3>(3) << std::endl;
  return 1;
}

结果:

foo<1>(3): -1
foo<2>(3): 9
foo<3>(3): 27

1 个答案:

答案 0 :(得分:7)

TL; DR:还没有,也许永远不会。

Rust泛型并不像C ++模板那样强大,也可能永远不会。

具体来说,需要两个功能:

注意:目前尚不清楚专业化的进展程度如何;在这种使用完全专业化的特定情况下,它应该足够了,但是不清楚是否将实现部分专业化以及如何实现。

还有其他缺失的部分,但与此案例无关:

  • RFC 1598: Generic Associated Types:相当于嵌套template <...> using ... = ...;并允许模拟模板模板参数,
  • 变量:已经有多个RFC,但似乎都没有立足之地。

嘲笑Rust开发人员很容易,或者因为缺乏成熟而耸耸肩;这也是不正确的。

正如我所提到的,目前还不清楚Rust是否会获得其中的一些功能,不是因为开发人员无法实现它们,他们当然可以,他们肯定可能已经,但是因为那里正确行事 1

例如,专业化是C ++中的噩梦。使用一组参数A来实例化模板 Undefined Behavior ,稍后(或在另一个翻译单元中)以匹配A的方式对其进行专门化。对于函数,这通常表示为链接器随机选择通用版或专用版。调试并不好玩。

对泛型的任何修改都会对类型系统的其余部分产生巨大的潜在影响,与其他语言功能的复杂交互以及关于良好类型程序意味着什么的重大变化:

  • 因此,他们受到严格审查,
  • 并且强烈推动并逐步构建 ,以便一次评估这些影响,交互和变化。

简而言之,Rust开发人员正在尝试构建一个结构良好的泛型系统,这并不容易。

1 还有人担心不必要的复杂性,因此不会添加功能&#34;只是因为&#34;,但需要激励用例,这些用例应足以证明其合理性语言和编译器的额外复杂性;但这完全是另一个门。