为什么 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;
}
很多年前,(至少对我而言)静态 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;
}