当我不能将模板用于通用函数或通用类时,有人可以向我解释吗?
我了解在编译时需要模板,因此,在某些情况下我们无法使用模板。但是我不清楚,我无法找到无法使用模板实现(但可以通过多态实现)的通用代码示例。
答案 0 :(得分:2)
不能在需要一种精确类型的模板(例如容器的内容)中使用模板。您可以做的是拥有一个非模板基和一个模板派生类。这称为类型擦除。
std::function<Foo(Bar)>
是一个很好的例子。存在来自许多不同可调用类型的转换构造函数,这些构造函数可以与签名Foo(Bar)
匹配,但是它们都导致单一类型std::function<Foo(Bar)>
,因此您可以使用std::vector<std::function<Foo(Bar)>>
。
extern Foo free_function(Bar);
extern Foo extra_args_function(Bar, Baz);
std::vector<std::function<Foo(Bar)>> foos
{
[](Bar b) { return Foo(); },
free_function,
&Bar::to_Foo,
std::bind(extra_args_function, std::placeholders::_1, Baz())
};
此外,您不能使模板虚拟方法。