多维模板 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
};
我有一个项目有多个专业,但每个专业我都需要 "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
};