На первый взгляд это кажется достаточно простым, просто используйте шаблонный конструктор в классе 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 );
}
Но на этом этапе легко увидеть, что «аргумент типа» действительно описывает необработанные данные и ничего больше.
Так что на самом деле это должен быть аргумент необработанных данных, который должен быть введен.
Более строгая типизация необработанных данных также поможет вам избежать ошибок, например. Необработанные данные радара обрабатываются как необработанные данные 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( "%s\n", "Sensor<GPS> object created." );
}
template<>
Sensor::Sensor( sensor::DataFrom< Kind::radar > const& rawData )
{
printf( "%s\n", "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
и в класс, несущий необработанные данные радара.
Ура и чт.,
person
Cheers and hth. - Alf
schedule
13.09.2011
Sensor
. - person John Dibling   schedule 13.09.2011