[英]Initializing `constexpr` Array with Pattern
我想使用使用可變參數模板參數生成的模式來初始化constexpr
數組。 為簡單起見,請考慮使用類型列表的大小初始化constexpr unsigned
靜態數組的問題,例如unsigned, short, char, int, long
。 我該怎么做,以便所有計算都在編譯時完成? 我需要該解決方案與C ++類型系統配合使用,因此我不能使用宏。
我能想到的最好結果如下所示,
但是使用
g++ -std=c++11 -Wall -Ofast -S
(使用g ++ 4.7)進行編譯以及對程序集的檢查清楚地表明,這些值在運行時被壓入堆棧。
有任何想法嗎?
並且工作正常 。
如果我能以某種方式告訴擴展n +1關於擴展n,那么使用如下數組初始化器將起作用。
static constexpr unsigned foo[] = { compute_element<Args>::value... };
編輯:等等,沒關系,我有個腦袋。 上面的行工作正常...
這是
代碼
答案 :
#include <iostream>
template <class... Args>
struct foo
{
static constexpr unsigned bar[] = { sizeof(Args)... };
};
int main()
{
std::cout << foo<unsigned, short, char, int, long>::bar[2] << std::endl;
return 0;
}
非常感謝您的寶貴時間!
這是答案。 請記住,由於C ++的限制,我認為這只能在編譯時完成,以創建與可變模板參數包大小相同的數組。
#include <iostream>
template <class... Args>
struct foo
{
static constexpr unsigned bar[] = { sizeof(Args)... };
};
int main()
{
std::cout << foo<unsigned, short, char, int, long>::bar[2] << std::endl;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.