1

私は答えとして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>();

コンポーネントのタイプが異なっていて、それらのタイプ名が判読できる場合、上記のコードは問題ありません。しかし、家のエリアに double 型があるなど、型名が読めない場合は、使用したいと思います

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

以外

house.get<double>();

また、面積と体積など、2 つのタイプのコンポーネントが 2 つある場合、複合体をどのように処理しますか? どうもありがとう!

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>();

テンプレートの継承について知っている人はいますか?パフォーマンスの低下はありますか? 私の意見では、ないと思います。どうもありがとう!

4

0 に答える 0