如何自动设置和获取方法?

时间:2013-01-20 00:34:26

标签: c++ templates

我接受onathan Wakely的评论作为回答。谢谢!以下是原帖。

[原帖] 了解如何在类中自动创建set和get方法,如下所示

template<class T>
class Has
{
public:
    template<class U>
    const U& get() const;

    template<>
    const T& get<T>() const
    {
        return m_t;
    }

    template<class U>
    void set(const U& t);

    template<>
    void set<T>(const T& t)
    {
        m_t = t;
    }

private:
    T m_t;
};

一个例子

class Door {};
class Window {};

class House
    : public Has<Door>
    , public Has<Window>
{};

House house;

// set
house.set(Door());
house.set(Window());

// get
const Door& door = house.get<Door>();
const Window& window = house.get<Window>();

如果组件的类型不同且类型名称可读,则上面显示的代码很好。但是如果类型名称不可读,例如房子的区域有双重类型,我想使用

house.get<Area>(); // or
house.get<AREA>(); // where the template argument can be a const integer

除了

house.get<double>();

如果有两个组件有双重类型,如面积和体积,如何处理复杂?非常感谢!

有一种方法可以将double包装为像

这样的新类型
template<class T>
class Wrap
{
public:
    Wrap(const T& value = T())
        : m_value
    {}

    operator T()
    {
        return m_value;
    }

private:
    T m_value;
};

class Area
    : public Wrap<double>
{};

要做到这一点,有任何表现感情吗?感谢。

根据jweyrich的建议,添加以下代码

template<class Name, class T>
class With
{
public:
    template<class U>
    const U& get() const;

    template<>
    const T& get<Name>() const
    {
        return m_t;
    }

    template<class U>
    void set(const U& t);

    template<>
    void set<Name>(const T& t)
    {
        m_t = t;
    }

private:
    T m_t;
};

我认为这完美无缺。

一个例子

class Door {};
class Window {};

class Area {};    // Empty, just a name holder
class Volume {};  // Another a name holder

class House
    : public Has<Door>
    , public Has<Window>
    , public With<Area, double>
    , public With<Volume, double>
{};

House house;

// set
house.set(Door());
house.set(Window());
house.set<Area>(3000);
house.set<Volume>(30000);

// get
const Door& door = house.get<Door>();
const Window& window = house.get<Window>();
double area = house.get<Area>();
double volume = house.get<Volume>();

任何人都知道模板继承,是否有任何性能降低?在我看来,我认为没有。非常感谢!

0 个答案:

没有答案