C++ 显式模板实例化和组合爆炸?

C++ 显式模板实例化和组合爆炸?,c++,templates,design-patterns,C++,Templates,Design Patterns,我正在编写一个策略模式类,它看起来像: template<typename Worker, typename Location, typename Behavior> class Driver { public: Location location; Behavior behavior; Worker* worker; Driver(); void start(); }; 模板 类驱动程序{ 公众: 位置; 行为; 工人*工人; 驱

我正在编写一个策略模式类,它看起来像:

template<typename Worker, typename Location, typename Behavior>
class Driver {
public:

    Location location;
    Behavior behavior;

    Worker* worker;

    Driver();

    void start();

};
模板
类驱动程序{
公众:
位置;
行为;
工人*工人;
驱动器();
void start();
};
在cpp文件中,我有以下内容:

template <typename Worker, typename Exchange, typename Behavior>
Driver<Worker, Exchange, Behavior>::Driver(){
    worker = new Worker();
};



template <typename Worker, typename Location, typename Behavior>
void Driver<Worker, Location, Behavior>::start(){
    ;
};


template class Driver<WorkerStruct1, LocationStruct1, BehaviorStruct1>;
模板
驱动程序::驱动程序(){
工人=新工人();
};
模板
无效驱动程序::开始(){
;
};
模板类驱动程序;
问题是,我有很多WorkerStruct、LocationStruct和BehaviorStruct。我使用策略模式的原因就是为了避免“组合爆炸”

但是,如果我必须实例化所有模板,我将在cpp文件的底部有一大堆实例化行。比方说,这3个分量中的每一个都有7条,那么我有7*7*7=343行

这就是策略模式的工作原理吗

一些评论问我为什么要实例化模板。我不知道出了什么问题,但如果我不实例化,我会得到编译错误:
“对Driver::Driver()的未定义引用”

为什么要实例化这些模板?如果在头文件中定义了所有内容,则不需要这样做。通常,编译器负责实例化模板。除非您做了一些特殊的事情,否则您不必自己实例化它们。Pete所指的“特殊”事情不是在头中定义模板:这是通常要做的事情,除非有很好的理由来做不同的事情(例如,对IOStreams和locales库使用显式实例化)[用于改进?-我已经有一段时间没有测量到差异]编译时间了。您是否在单独的.cpp文件中定义teplate类方法,并尝试将它们压缩到二进制库中?这可能是您需要expicit实例化的唯一原因。您认为其中哪一部分不清楚?