最近想做一个类模板,希望兼容自己项目里的其他类和C++的内置类型。
同时希望这个类型支持直接调用模板类的初始化。这个昨天发过问答,只有一位teacher给回答说用CRTP。但是没有用上,自己查别的资料发现只要写using T::T;
就可以了,所以问答就撤掉了,对那位回答的teacher说句不好意思。
template<typename T>
class Base : public T
{
public:
using T::T;
Base() {}
//一些功能...
};
现在又遇到了新的问题,上面的这个类型Base
里面实际上没有申请储存空间,所有的数值都在继承到的模板类型typename T
里面。这样一来又出现了新的问题,就是没办法支持C++的内置类型了。
我自己的思路是,对Base
类的模板进行筛选,首先确定是否是C++内置类型,然后根据结果选择不同的模板来创建:
template <typename T,
typename = std::conditional<bool(is_class::result), T, CoverType> // is_class是网上抄的判断是否为类型的方法
class Base : T
{
...
};
//! CoverType定义
template <typename T>
class CoverType
{
private:
T content;
public:
//! 模仿内置类型创建基础的运算规则
};
因为使用CoverType代替了内置类型,使用这种方式会不会导致运行速度降低很多,或者有什么隐患
基础类型数据用偏特化Base版本
template<typename T, bool = std::is_class<T>::value>
class Base : public T {
T* t;
public:
using T::T;
Base() {}
};
template<typename T>
class Base<T, false>{
T t;
public:
Base() {}
};
Base<int> b;
是的,使用CoverType模板来代替内置的类型会带来一定的性能损失。这是因为CoverType类模板可能会被实现成一个复杂的类,而它的效率比内置类型要低得多。此外,CoverType类模板还会限制使用者可以使用哪些操作符,这样可能会对使用者的编程体验造成一定的影响。
另外,为了更好地支持内置类型,可以考虑使用enable_if技术来排除掉内置类型,以便在实例化Base类模板的时候,可以避免使用CoverType类模板,从而避免性能损失和对使用者的编程体验的影响。
我实在没想出什么地方需要自己定义一个类来代替系统提供的int
兼容类也就算了,兼容内置类型有什么意义呢?内置类型是大家共识的一个符号。
可以定义类实现基本数据类型的功能,但是不能替换基本数据类型。
使用 CoverType 代替内置类型可能会影响性能,因为 CoverType 会对内置类型封装,从而使代码变得更复杂。此外,如果您没有为 CoverType 实现所有与内置类型相关的运算,则可能出现未定义行为。您需要仔细测试您的代码以确保它正常工作,并且在必要时对 CoverType 实现进行适当的优化。