多维模板 cpp

Template over multiple dimensions cpp

我有一个项目有多个专业,但每个专业我都需要 "BasicStuff"。问题:我需要使用一些模板,因为只有专业化才知道一些对象的样子。

例如,我有一些 class "BasicData"、"BasicDataHolder" 和 "BasicDataManager",其中 BasicData 将是带有时间戳的 class。 BasicDataHolder 将像向量一样保存 BasicData,但具有更多功能。 BasicDataManager 会处理 BasicDataHolder 的多个对象。

现在的问题:

在每个专业中,我都有一些 "SpecialData" 派生自 BasicData。我有时必须使用 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;

我收到多行错误,例如: "error: 'SpecialDataManager' does not name a type"

我真正的问题是多了一个维度,但我想如果我能解决这个问题,应该就没问题了。 有人可以帮忙吗?我不确定我哪里做错了...

您似乎想要这样的东西:

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
};