模板化类,如何在不使此类模板化的情况下表示为另一个类的成员变量
Templated classes, how to represent as a member variable of another class without making this class templated
>我有一个模板化类,
template<typename T>
class TClass
{
public:
//functions here
};
class Holding {
public:
private:
TClass<T> m_item; //don't want this
};
int main() {
Holding hd;
//do whatever
return 0;
}
我想要在 Holding 中创建一个实例变量,但不想让 Holding 成为模板类。 我的设计选项是什么?
看起来你想持有任何类型。如果确实如此,那么您可以使用boost::any
:
class Holding {
public:
private:
TClass<boost::any> m_item; //you want this?
};
如果您不使用 Boost,那么您可以自己实现any
或在此站点上搜索其实现或使用 google。
从非模板基类派生TClass
B
,并Holding
持有指向B
的指针(可能是std::unique_ptr
)。
我可能没有正确理解你的问题。基本上,您有一个模板类 TClass,需要通过模板参数进行配置。然后,您拥有拥有TClass的Hold,但出于任何原因,您都不想将Holding作为模板。
这意味着 Holding 需要静态定义模板参数是什么
TClass<SomeClass> m_item;
现在,你在代码中说你不想要这个...我不确定您是不想提供模板参数还是提供 T。如果是 T,上面的代码将解决您的问题。否则,您需要使用 typedef 来删除模板参数并具有"无模板"类型,例如:
typedef TClass<int> intTClass; // replace int by whatever param you want
然后可以用作
class Holding {
public:
private:
intTClass m_item; //don't want this
};
如果可能的馆藏足够相似,则可以使用类型擦除。
#include <memory>
class HeldType {
public:
virtual void myfunc() = 0;
virtual ~HeldType() {}
};
template<typename T>
class HeldTypeModel : public HeldType {
public:
HeldTypeModel(const T& t) : data_(t) {}
void myfunc() { data_.myfunc(); }
private:
T data_;
};
class TClass {
public:
TClass() : x_(nullptr) {}
template<typename T>
void set_t(const T& t) {
x_.reset(new HeldTypeModel<T>(t));
}
std::unique_ptr<HeldType> x_;
};
class model {
public:
void myfunc() {}
};
int main()
{
TClass x;
x.set_t(model{});
return 0;
}
您需要弄清楚所有可能的 T 之间的共性是什么。您可能还想添加一些函数来获取typeid
并抛弃实际类型等。看看boost::any
.
如果你更倾向于实验性的东西,你可以看看Boost.Type Erasure,它删除了一些样板,但还不是正式版本的一部分。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在C++中如何在没有pow的情况下进行基础计算
- 松弛原子与无同步情况下的记忆连贯性
- 模板化类,如何在不使此类模板化的情况下表示为另一个类的成员变量
- Winsock: Overlapped AcceptEx表示在没有客户端连接的情况下有一个新的连接
- C++在不进行*序列化的情况下获取unsodered_set*的字节表示