在编译时定义多个派生类

时间:2018-02-23 15:36:33

标签: c++ abstract-class

我希望节省时间,并在添加新类型时避免编写重复的代码。

我目前的情况如下:

class BaseClass {
    std::string m_name;
public:
    BaseClass(const std::string name) : m_name(name) {};
    std::string getName(void) { return m_name; }
    virtual std::string toString(void) = 0;
};

class DerivedInt8 : public BaseClass {
    uint8_t m_value;
public:
    DerivedInt8(const uint8_t value, const std::string name) : BaseClass(name), m_value(value) {}

    virtual std::string toString(void) {
        std::ostringstream os;
        os << getName() << ": " << m_value;
        return os.str();
    }
};

class DerivedInt16 : public BaseClass {
    uint16_t m_value;
public:
    DerivedInt16(const uint16_t value, const std::string name) : BaseClass(name), m_value(value) {}

    virtual std::string toString(void) {
        std::ostringstream os;
        os << getName() << ": " << m_value;
        return os.str();
    }
};

我还有uint32_t,uint64_t和一些其他自定义类的派生类。在C ++中有一个干净的方法我可以定义一个新类型而不必为我决定在将来添加的每个新类型复制代码吗?在C中,我会使用某种形式的X-Macros来定义编译时所需的一切;我可以使用C ++中的镜像吗?

1 个答案:

答案 0 :(得分:2)

template <typename T>
class Generic : public BaseClass {
    T m_value;
public:
    Generic(T value, const std::string& name)
    : BaseClass(name), m_value(value) {}

    std::string toString(void) const override {
        std::ostringstream os;
        os << getName() << ": " << m_value;
        return os.str();
    }
};
using DerivedInt8 = Generic<uint8_t>;
using DerivedInt16 = Generic<uint16_t>;

这是超级基础,应该在介绍性文本中介绍,你应该明确阅读。

你也是按值传递const参数,这在很大程度上是没有意义的(我假设你的意思是const std::string&),有的方法应该是const限定的(getName和{{1} }),并且在实现虚函数时不要使用toString