什么时候不能使用模板?

时间:2018-07-18 10:38:37

标签: c++ c++11 templates

当我不能将模板用于通用函数或通用类时,有人可以向我解释吗?

我了解在编译时需要模板,因此,在某些情况下我们无法使用模板。但是我不清楚,我无法找到无法使用模板实现(但可以通过多态实现)的通用代码示例。

1 个答案:

答案 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())
};

此外,您不能使模板虚拟方法。