模板多维度cpp

时间:2017-10-06 14:18:39

标签: c++ class templates derived

我有一个具有多个专业化的项目,但我需要在每个专业化中使用一些“BasicStuff”。问题:我需要使用一些模板,因为只有特化才能知道某些对象的外观。

例如,我有一些类“BasicData”,“BasicDataHolder”和“BasicDataManager”,其中BasicData将是一个带时间戳的类。 BasicDataHolder会将BasicData保存为向量,但具有更多功能。 BasicDataManager将使用BasicDataHolder的多个对象。

现在出现问题:

在每个专业化中,我都有一些从BasicData派生的“SpecialData”。而且我必须在某个时候使用BasicDataManager1,在另一个专门化中使用BasicDataManager2,它们都是从BasicDataManager派生的。

不幸的模板对我来说就像伏都教,但我尝试了以下内容:

    // BasicData.hpp
    class BasicData {
        int foo;
    };

    // BasicDataHolder.hpp
    template< typename T>
    class BasicDataHolder {
        static_assert(std::is_base_of<BasicData, T>::value, "!");
        vector<T> data;
        // other stuff
    };

    // BasicDataManager.hpp
    template <class T>
    // I tried something like template <template T> but it tells me
    // error: expected '<' before 'T'
    class BasicDataManager {
        // This Line is a problem
        static_assert(std::is_base_of<BasicDataHolder, T>::value, "!");
        vector<T> holderVector;
        // stuff
    };

    // specialDataManager
    template <class T>
    class SpecialDataManager : public BasicDataManager<T> {
        T dostuff();
        // other stuff
    };

    //specialDataHolder
    template <class T>
    class SpecialDataHolder : public BasicDataHolder<T> {
        // do some stuff
    };

    // Specialization:
    //specialData.hpp
    template <typename T>
    class SpecialData : public T {
        static_assert(std::is_base_of<BasicData, T>::value, "!");
        double bar;
        //other stuff
    };

现在我必须在项目专业化中初始化SpecialDataManager。 我尝试过像

    // main.cpp
    #include "specialData.hpp
    #include "specialDataManager.hpp
    #include "specialDataHolder.hpp
    // This line is my problem, I think
    SpecialDataManager<SpecialDataHolder<SpecialData> > myManager;

我得到多行错误,例如: “错误:'SpecialDataManager'没有命名类型”

我真正的问题是更多的维度,但我想如果我能解决这个问题,那就不再是问题了。 有人可以帮忙吗?我不确定我在哪里犯了错误......

1 个答案:

答案 0 :(得分:0)

看起来你想要这样的东西:

class BasicData {
    int foo;
    // other stuff
};

template <typename T>
class BasicDataHolder {
    static_assert(std::is_base_of<BasicData, T>::value, "!");
    using data = vector<T>;
    data mData;
    // other stuff
};

template <class T>
class BasicDataManager {
    using holderVector = vector<T>;
    holderVector mData;
    // stuff
};

template <class T>
class SpecialDataManager : public BasicDataManager<T> {
    T dostuff();
    // other stuff
};

template <typename T>
class SpecialDataHolder : public BasicDataHolder<T> {
    // do some stuff
};

template <template T>
class SpecialData : public T {
    static_assert(std::is_base_of<BasicData, T>::value, "!");

    double bar;
    //other stuff
};