我工作的一類,以確定紋理內的圖像,像這樣:定義一個類,其成員函數存在根據模板基類
using level_t = ...
using layer_t = ...
using face_t = ...
template <bool>
struct levels {};
template <>
struct levels<true> {
level_t level = level_t{0};
};
template <bool>
struct layers {};
template <>
struct layers<true> {
layer_t layer = layer_t{0};
};
template <bool>
struct faces {};
template <>
struct faces<true> {
face_t face = face_t{0};
};
template <bool HasLevels, bool HasLayers, bool HasFaces>
struct index : levels<HasLevels>, layers<HasLayers>, faces<HasFaces> {};
凡level_t
,layer_t
和face_t
是int的一種「strong typedef」(基本上不同的類型看起來像一個int,但沒有隱式轉換)。
現在,我可以用我喜歡的類型,像這樣:
using Index1 = index<true, true, false>;
void f(Index1);
Index1 v;
v.level = level_t{1};
v.layer = layer_t[1};
f(v);
但是,爲了使生活爲我的用戶更容易我希望讓這樣的代碼:
f({level_t{1}, layer_t{1}};
的集合初始化是出應有的基類,所以我需要自己寫一個構造函數;編寫一個支持所有參數組合的構造函數(但不是重新排序)的最好/最聰明的方法是什麼?
是否有一個原因,你必須使用多繼承而不是聚合? – zneak
「所有參數組合(但不包括重新排序)」是什麼意思?您是否指向任何模板參數值而不重新構造函數的參數? –
@zneak在這種情況下是的,根據'index'類型是如何配置的,一些屬性必須消失並嘗試使用它們必須導致編譯錯誤 – dvd