我想要一個具有讀寫方法的抽象類,例如:
template<typename Iterator>
virtual void read(uint64_t adr, Iterator begin, Iterator end) const = 0;
template<typename Iterator>
virtual void write(uint64_t adr, Iterator begin, Iterator end) const = 0;
有沒有辦法實作這樣的目標?
既然不能有虛模板方法,我就想到了
- 擺脫抽象類并改用模板。在模板中,我假設有一個使用迭代器的讀/寫方法。
- 使抽象類也成為模板并傳遞迭代器型別。
這些方法之一是干凈的嗎?順便說一句,我在使用 C 11
uj5u.com熱心網友回復:
這些方法之一是干凈的嗎?
是的:使用靜態多型而不是virtual函式。當型別通過模板傳遞時,它不會被擦除,因此不需要預先生成的虛擬表,因此您可以導致進一步的模板實體化 - 這就是您的用例所要求的。
解決方案1(推薦)
因此,如果您的抽象類僅用作“ interface”,請洗掉它并直接在“實作”中寫入read/ write:
struct Impl {
template<typename Iterator> void read(uint64_t, Iterator, Iterator) const { /* work */ }
template<typename Iterator> void write(uint64_t, Iterator, Iterator) const { /* work */ }
};
并通過該抽象類替換實作類的用法
template<typename Impl> void use_any_impl(Impl&&) { /* work */ }
但是,如果您的抽象類包含一些要繼承的邏輯/資料,您可以保留該類但洗掉任何內容virtual:
class Abstract {
protected: ~Abstract() = default;
public: constexpr int inherit_me() const { return 42; }
};
class Impl: public Abstract { /* read() and write() same as above */ };
/* use_any_impl() same as above */
解決方案2
如果您的templatedIterator總是(或可以減少到)導致原始陣列存盤(例如由 提供的std::vector<unsigned char>::data),這對于原始讀/寫操作似乎是合理的,您可以只使用原始指標:
virtual void read(uint64_t, unsigned char*, unsigned char*) const = 0;
virtual void write(uint64_t, unsigned char*, unsigned char*) const = 0;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/347513.html
上一篇:模板型別擦除
