非模板类的模板化构造
Templated construction of non-template class
我有一个类,它有共同的成员,但需要基于枚举以有限种方式构造。每种类型在编译时都是已知的,所以我认为模板在这里是有意义的。我知道我可以用构造函数专门化来解决这个问题,例如:
enum SensorTypes{GPS,Radar,ShaftEncoder};
template<SensorTypes>
class Sensor
{
public:
Sensor(unsigned char* rawdata){//Format of rawdata depends on SensorTypes};
private:
double speed;
double time;
}
template<> Sensor<GPS>::Sensor(unsigned char* rawdata){speed = (double)rawdata[0];}
问题是我有遗留代码,必须接受Sensor
类而不是Sensor<GPS>
等。如何在保持单一类类型的同时实现类似的编译时构造?
这看起来很简单,只需在Sensor
类中使用模板化的构造函数。
#include <stdio.h>
namespace sensorKind {
struct GPS {};
struct Radar {};
struct ShaftEncoder {};
}
class Sensor
{
public:
template< class Kind >
Sensor( Kind, unsigned char const* rawdata );
private:
double speed_;
double time_;
};
template<>
Sensor::Sensor(
sensorKind::GPS,
unsigned char const* rawData
)
{
printf( "Sensor<GPS> object created.n" );
}
template<>
Sensor::Sensor(
sensorKind::Radar,
unsigned char const* rawData
)
{
printf( "Sensor<Radar> object created.n" );
}
int main()
{
Sensor aGPSSensor( sensorKind::GPS(), 0 );
Sensor aRadarSensor( sensorKind::Radar(), 0 );
}
但是在这一点上,很容易看出"类型参数"实际上是描述原始数据,而不是其他。
实际上,应该输入的是rawdata参数
使原始数据更严格的类型还可以帮助您避免混淆,例如雷达原始数据被视为GPS原始数据。
#include <stdio.h>
namespace sensor {
struct Kind {
enum Enum{ gps, radar, shaftEncoder };
};
template< Kind::Enum aKind >
class DataFrom
{
public:
static Kind::Enum const kind = aKind;
unsigned char const* ptr() const { return 0; }
DataFrom() {}
};
} // namespace sensor
class Sensor
{
public:
typedef sensor::Kind Kind;
template< class DataKind >
explicit Sensor( DataKind const& rawData );
private:
double speed_;
double time_;
};
template<>
Sensor::Sensor( sensor::DataFrom< Kind::gps > const& rawData )
{
printf( "%sn", "Sensor<GPS> object created." );
}
template<>
Sensor::Sensor( sensor::DataFrom< Kind::radar > const& rawData )
{
printf( "%sn", "Sensor<Radar> object created." );
}
int main()
{
sensor::DataFrom< sensor::Kind::gps > gpsData;
sensor::DataFrom< sensor::Kind::radar > radarData;
Sensor aGPSSensor( gpsData );
Sensor aRadarSensor( radarData );
}
在设计方面,它被划分为原始数据提供程序和原始数据解释器(Sensor
类显然是一个原始数据解释器)。
该设计是由问题隐含的,但是如果可能是,那么将解释知识移近数据源可能是有益的。
。,将例如雷达数据的解释从Sensor
构造函数和类中移出,并放入携带雷达原始数据的类中。
干杯,hth。
根据您的具体需要,您可以创建一个非模板基类并派生模板特定的版本,使用虚拟方法来选择正确的行为。
这看起来很简单,只需从现有的Sensor
类派生模板类。
template<SensorTypes>
class DerivedSensor : public Sensor
{
public:
DerivedSensor(unsigned char* rawdata){//Format of rawdata depends on SensorTypes};
};
相关文章:
- 没有找到相关文章