[英]What is the C++14 alternative to C99 compound literals, without using dynamic allocation?
我正在開發一個帶有 MPU 的 ARM 處理器的嵌入式系統,使用 C++14,我想保持動態分配的數量,也在初始化期間,因為我更喜歡知道鏈接中使用的確切內存量時間。
在 C99 中,您可以使用復合文字在堆棧或全局范圍上分配內存,請參閱此廢話代碼,該代碼在編譯時在結構中分配結構:
struct Foo {
struct Foo* next;
};
struct Foo *bar = {
&(struct Foo){
&(struct Foo){ NULL }
}
};
不可能使用任何 GCC 或 Clang 擴展來解決這個問題,只能使用純 C++14 代碼。
我發現模仿這種行為的唯一簡單方法是使用 lambda 函數。 但是,此解決方案不可重入。
struct Foo* bar = [](){
static struct Foo bar = {
static struct Foo bar = { nullptr };
return &bar;
}();
return &bar;
}();
lambda 解決方案適用於我的情況,我可以使用宏使其使用起來更舒適,但如果我想將數據結構放在堆棧上,這不是一個解決方案。
解決此問題的最佳 C++ 方法是什么(不使用動態分配)?
我正在嘗試解決的當前問題是派生類樹,我想在編譯時分配它。
我試圖在想象的 C++ 代碼中實現的目標:
RootClass* b = &(DerivedClass1){ &(DerivedClass2){10},
&(DerivedClass2){20},
&(DerivedClass1){ &(DerivedClass0){} }
};
我試圖在想象的 C++ 代碼中實現的目標:
嗯,這永遠不會奏效。 不要求這些派生類中的任何一個與基類的大小相同,因此不可能對基類進行指針算術(即使 C++ 允許對指向元素類型為數組的基類指針進行指針算術)派生類。它沒有)。
如果您正在處理單個類型T
,那么您可以這樣做:
T ts[] = {<initializers>};
您可以根據需要使用ts
。 但這僅適用於正確的數組。
現在,如果你想做你的派生類的事情,你總是可以使用一個tuple
作為派生類元素的容器,然后構建一個指向基類元素的指針數組,這樣你就可以從一個元素到另一個元素進行迭代。 C++14 使這有點麻煩,因為它要求您在tuple
類型本身中列出類型,但 C++17 的類模板參數推導使其更易於理解:
auto tpl = tuple(DerivedClass2{10}, DerivedClass2{20}, DerivedClass1{DerivedClass0{}});
C++14 版本只是重復了類型。
構建數組需要一些模板元編程技術:
template<typename BC, typename Tpl, std::size_t ...ixs>
auto GetBaseClassArrayHelper(Tpl &tpl, std::index_sequence<ixs...>)
{
return std::array<BC*, std::tuple_size<Tpl>::value>{static_cast<BC*>(std::get<ixs>(tpl))...};
}
template<typename BC, typename Tpl>
std::array<BC*, std::tuple_size<Tpl>::value> GetBaseClassArray(Tpl &tpl)
{
return GetBaseClassArrayHelper<BC>(tpl, std::make_index_sequence<std::tuple_size<Tpl>::value>{});
}
現在,這不會讓您將BaseClass*
和++
帶入不同的BaseClass*
。 你需要有一個指向指針數組的指針,一個BaseClass**
才能做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.