在C ++中的另一个类中使用模板类

时间:2017-02-03 13:58:22

标签: c++ class templates

我有一个模板类,我想在另一个类中使用。问题是我想在不知道实际类型的情况下使用模板类。

一个简单的例子:

template <class T> 
class Foo{
    private:
        T x_;
    public:
        void Foo(T);
};

现在,另一个使用Foo的课程。我想做的是:

class Bar{
    private:
        Foo foo_;

    public:
        Bar(Foo);
};

问题是FooBar内使用时需要模板参数。如果Bar类使用任何模板参数处理Foo,那将是很好的。有解决方法吗?

1 个答案:

答案 0 :(得分:6)

Bar本身成为类模板

template <typename T>
class Bar{
    private:
        Foo<T> foo_;

    public:
        Bar(Foo<T>);
};

或者,您可以在常见的多态接口下 type-erase Foo。这限制了Foo的使用,并引入了运行时和内存开销。

struct FooBase {
    virtual ~FooBase() { }
    virtual void Xyz(int) { }  
};

template <class T> 
class Foo : FooBase {
    private:
        T x_;
    public:
        void Foo(T); 
        void Xyz(int) override 
        {
            // `T` can be used in the definition, but 
            // cannot appear in the signature of `Xyz`.
        }
};

class Bar{
    private:
        std::unique_ptr<FooBase> foo_;

    public:
        Bar(std::unique_ptr<FooBase>&&);
};