簡體   English   中英

C++ 多態模板 class,模板類型 object 的實例化

[英]C++ Polymorphic template class, instantiation of template type object

我有以下情況,我想實例化一個模板類型的 object。
我希望模板類型 object 的實例化依賴於“實例化器”class。

template <class T>
class Base
{
public:
  Base(){}

  void do_something()
  {
    T obj = this->Test();
    // do something with object
  }

  virtual T Test()
  {
   return T(5);
  }
};


template <class T>
class Derived : public Base<T>
{
public:
  Derived() : Base<T>() {}
  virtual T Test()
  {
    return T(5, 6);
  }
};

class Test1
{
public:
  Test1(int x){}
};
class Test2 : public Test1
{
public:
  Test2(int x, int y) : Test1(x) {}
};

稍后在我的代碼中,我想使用 Base 或 Derived 對象。 他們對 function do_something()中的模板類型 object ( obj ) 執行操作。 我想讓obj的實例化依賴於Test() function 的實現。 Base僅適用於Test1類型的對象或具有相同構造函數的Test1派生類。 Derived應該只適用於與Test2具有相同構造函數的對象。

Base<Test1>(); // works
Base<Test2>(); // doesn't work, but should not work by my design and throw a compile error
Derived<Test1>(); // same
Derived<Test2>();  // should work, but doesn't,
// since Base::Test() still exists, but cannot be compiled due to wrong constructor of T

有沒有辦法實現所描述的行為? 或者我可以進行設計更改嗎?

您可以將 Base 更改為對於任何T都是正確的:

template <class T>
class Base
{
public:
    Base(){}

    void do_something()
    {
        T obj = this->Test();
        // do something with object
    }

    virtual T Test()
    {
        if constexpr (std::is_constructible_v<T, int>) {
            return T(5);
        }
        throw std::runtime_error("should not be called");
    }
};

Base<Test2>(); 會編譯但在運行時拋出。

拆分似乎更好,並有兩個派生:

template <class T>
class Base
{
public:
    Base() = default;
    virtual ~Base() = default;

    void do_something()
    {
        T obj = this->Test();
        // do something with object
    }

    virtual T Test() = 0;
};

template <class T>
class Derived : public Base<T>
{
public:
  Derived() : Base<T>() {}
  T Test() override { return T(4); }
};

template <class T>
class Derived2 : public Base<T>
{
public:
  Derived() : Base<T>() {}
  T Test() override { return T(5, 6); }
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM