为什么 C++1* 仍然需要 template 关键字来代替 Full Duck Typing

Why Does C++1* Still Need the template Keyword in Lieu of Full Duck Typing

很多年前,(至少对我而言)静态 C++ 多态性似乎是连贯的。 Python 等语言依赖于 duck typing,您有:

def fn(foo, bar):
    foo.baz(bar.bo())

我的想法是,如果它 "quacked" 适当,就语言而言没问题。

相反,在 C++ 中,您必须解释 "animal" 它是什么:

void fn(foo_type foo, bar_type bar);

并且对于 "kingdoms of families",您明确需要使用 template 关键字:

template<class Foo, class Bar>
void fn(Foo foo, Bar bar);

有了像 auto ...() -> decltype return types, but especially generic lambdas 这样的新功能,似乎有一些更像非模板 Python 的鸭子打字:

[] (auto container) { return container.size(); };

那么我的问题是,为什么还需要 template 关键字?为什么不完全接受(可选)鸭子打字:

// Takes a foo_type and a bar_type 
void fn(foo_type foo, bar_type bar);

// Takes some "foo-quacking" type, and a bar_type
void fn(auto foo, bar_type bar);

// Etc.

作为 Concepts 功能的一部分,它实际上已经接近尾声,一些编译器已经实现了它!例如,对于 GCC 4.9,如果您指定 -std=c++1y,您实际上可以编译和 运行 以下内容:

auto print_arg(auto arg) {
  std::cout << arg;
}