【问题标题】:C++ Specify variable type a posteriori in derived classC ++在派生类中后验指定变量类型
【发布时间】:2014-09-23 11:16:38
【问题描述】:

我有两个不同类型对象的数据库,它们具有一些常用功能,因此我想创建一个包含常用功能定义的父类。这个想法是,即使对象的类型不同,这些函数也必须执行相同的操作。一个愚蠢的例子:

class Database
{
public:
    // retrieve size of the dataset
    int Size() const {return list_.size();}
};

class DerivedDatabase : public Database
{
private:
    // list of dataset objects
    std::vector<Object1> list_;
};

class DerivedDatabase2: public Database
{
private:
    // list of dataset objects
    std::vector<Object2> list_;
};

一种解决方案是将函数定义为virtual Size() const =0,然后让派生类覆盖它。然而,这个想法是在我必须创建新类型的数据库时已经实现它。有没有办法在派生类中指定后验变量类型?这两个派生数据库本质上是不同的,它们的行为完全不同,除了一些常见的功能。因此它们必须是单独的对象

【问题讨论】:

  • CRTP 可能会有所帮助。

标签: c++ class inheritance


【解决方案1】:

您可以使用CRTP 来分解代码,例如:

template <typename T> class Database
{
// T should have a container named list_
public:
    // retrieve size of the dataset
    int Size() const { return AsDerived().list_.size(); }
private:
    const T& AsDerived() const { return static_cast<const T&>(*this); }
    T& AsDerived() { return static_cast<T&>(*this); }
};

然后

class DerivedDatabase : public Database<DerivedDatabase>
{
    friend class Database<DerivedDatabase>;
private:
    std::vector<Object1> list_;
};

class DerivedDatabase2 : public Database<DerivedDatabase2>
{
    friend class Database<DerivedDatabase2>;
private:
    std::vector<Object2> list_;
};

请注意,DerivedDatabaseDerivedDatabase2 在此处不共享一个共同的基类型

Live example

【讨论】:

    【解决方案2】:

    当然,templates 的用途是:

    class Database {
        virtual int size() = 0;
    public:
        // retrieve size of the dataset
        int Size() const {return size();}
    }
    
    template<typename T>
    class DerivedDatabase: public Database {
        std::vector<T> list_;
        int size() const {return list_.size();}
    }
    

    【讨论】:

    • 这样,Size 不能在Database 中拥有给定的实现。
    • 这两个派生数据库本质上是不同的,除了一些通用的功能外,它们的行为完全不同。在解决方案中,您打算在派生类中定义 size 函数。是否有可能在基类中指定了函数,但每个子类使用不同的变量类型运行?
    • @iprafols 没有理由你不能简单地在具有(非模板化)std::vectors 不同类型的派生类中通过 virtual int size() 接口工作。
    猜你喜欢
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 2018-05-19
    • 2015-08-16
    • 1970-01-01
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多