[英]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.