c++ - 非模板类的模板化构造

标签 c++ templates constructor specialization

我有一个具有共同成员但需要基于枚举以有限数量的方式构造的类。每种类型在编译时都是已知的,所以我认为模板在这里很有意义。我知道我可以通过构造函数特化来解决这个问题,例如:

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( "%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 构造函数和类中取出,并放入承载雷达原始数据的类中。

干杯,

关于c++ - 非模板类的模板化构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7405411/

相关文章:

c++ - 排序数组优先级队列

c++ - 是否有构造函数/析构函数方法的总称?

php - 普通网站的 Wordpress 主题

mysql - Golang 在 Struct 属性中使用小写首字母

c++ - g++ : which ways exist to find out which template specialization has been chosen by compiler?

PHP 特征 : How to circumvenient constructors or force them to be called?

c++ - 为什么 prevInstance 存在于 WinMain 和 wWinMain 中,如果它始终为 NULL

c++ - 从数组取值的 "procedure"有名字吗?

function - 使用 Swift 结构构造函数作为函数

java - 构造函数可以返回一个空对象吗?