重新排序C ++模板函数

时间:2010-06-13 18:34:54

标签: c++ templates definition

在C ++中,我有一个模板函数,在给定条件下,它调用另一个类中的模板函数。问题是另一个类要求实现第一个类的完整定义,因为它创建了第二个类并存储它们并以类似的方式管理它们。

麻烦的是,它们自然而然地成为一个类,因此有一些紧密的互操作,除了我需要它们是两个类来处理线程的原因。所有线程的主人,每个线程一个孩子,系统。

有关如何实施此建议的任何建议?

编辑@评论: 我有一个看起来像这样的问题:

class Master {
public:
    Child* CreateChild() {
        return new Child();
    }
    template<typename T> T* GetSomething(int arg) {
        return NULL;
    }
};
class Child {
    Master* master;
    template<typename T> T* GetSomething(int arg) {
        if (arg) return master->GetSomething<T>(arg);
        else return NULL;
    }
};

那些显然不是实际的实现,但足够类似于演示。如果这些是非模板函数,PIMPL只会有所帮助,但由于它们是,所以IMPL需要就在这里。

大师班管理所有孩子(为什么我选择师父和孩子而不是父母/孩子或主/奴?),他们的记忆,生命等等,以及一些其他系统范围的必需品。但Child类提供了大部分访问权限,在某些情况下必须回退到Master类。

此外,我还没有办法转向动态绑定。我的系统的其余部分已经彻底滥用动态绑定到绝对最大值,而我根本无法承受以这种方式再次使用它们的性能。有问题的Child函数被非常非常频繁地调用。

3 个答案:

答案 0 :(得分:2)

对于您的示例,类具有模板函数的事实没有真正的区别;只需要对Child类进行前向引用,并在声明Child类之后放置CreateChild函数的定义:

class Child;
class Master {
public:
    Child* CreateChild() ;
    template<typename T> T* GetSomething(int arg) {
        return NULL;
    }
};

class Child {
public:

    Master* master;
    template<typename T> T* GetSomething(int arg) {
        if (arg) return master->GetSomething<T>(arg);
        else return NULL;
    }
};

Child* Master::CreateChild() {
    return new Child();
}

答案 1 :(得分:1)

最好的办法是尽可能地将它们分离,然后让“孩子”只使用指向“父”对象的指针(反之亦然)。这可能会变得棘手,具体取决于您要对模板执行的操作,因为它要求您将声明(头文件)与实现(C文件)正确分开。

Child.h:不要包含Parent.h,而是使用前向声明(例如:class Parent;)。然后,您可以定义仅接受或返回父指针的函数(无引用或实例)。您无法调用任何Parent成员函数或访问标题内的成员变量。

Parent.h:正常包含Child.h。对此文件中使用Parent或Child对象没有任何限制。

Parent.cpp和Child.cpp:正常包含Child.h和Parent.h。在这些文件中使用Parent或Child对象没有任何限制。

答案 2 :(得分:0)

简短的回答是:“转移到动态绑定。”

答案很长。那么,这取决于你想要达到的目的。但在大多数情况下,PIMPL惯用法通常是合适的,但为了达到这个目的,你必须牺牲一些性能。