第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

以編譯方式在C ++中編譯時創(chuàng)建靜態(tài)數(shù)組

以編譯方式在C ++中編譯時創(chuàng)建靜態(tài)數(shù)組

C++
慕無忌1623718 2019-08-30 16:56:04
以編譯方式在C ++中編譯時創(chuàng)建靜態(tài)數(shù)組可以在編譯時定義靜態(tài)數(shù)組,如下所示:const std::size_t size = 5;    unsigned int list[size] = { 1, 2, 3, 4, 5 };問題1 - 是否可以通過使用各種元編程技術(shù)在編譯時“以編程方式”分配這些值?問題2 - 假設(shè)數(shù)組中的所有值都是相同的barr,是否可以在編譯時以編程方式選擇性地分配值?例如:const std::size_t size = 7;        unsigned int list[size] = { 0, 0, 2, 3, 0, 0, 0 };歡迎使用C ++ 0x的解決方案陣列可能非常大,幾百個元素長現(xiàn)在的數(shù)組只包含POD類型還可以假設(shè),以靜態(tài)編譯時兼容的方式預(yù)先知道陣列的大小。解決方案必須是C ++ (沒有腳本,沒有宏,沒有pp或基于代碼生成器的解決方案)更新: Georg Fritzsche的解決方案非常棒,需要一些工作才能在msvc和intel編譯器上進(jìn)行編譯,但這仍然是解決問題的一種非常有趣的方法。
查看完整描述

3 回答

?
SMILET

TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊

您可以獲得的最接近的是使用C ++ 0x功能從可變參數(shù)模板參數(shù)列表初始化模板的本地或成員數(shù)組。

這當(dāng)然受到最大模板實(shí)例化深度的限制,并且必須測量實(shí)際上在您的情況下顯著差異。


例:


template<unsigned... args> struct ArrayHolder {

    static const unsigned data[sizeof...(args)];

};


template<unsigned... args> 

const unsigned ArrayHolder<args...>::data[sizeof...(args)] = { args... };


template<size_t N, template<size_t> class F, unsigned... args> 

struct generate_array_impl {

    typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;

};


template<template<size_t> class F, unsigned... args> 

struct generate_array_impl<0, F, args...> {

    typedef ArrayHolder<F<0>::value, args...> result;

};


template<size_t N, template<size_t> class F> 

struct generate_array {

    typedef typename generate_array_impl<N-1, F>::result result;

};

適用于您的1..5情況:


template<size_t index> struct MetaFunc { 

    enum { value = index + 1 }; 

};


void test() {

    const size_t count = 5;

    typedef generate_array<count, MetaFunc>::result A;


    for (size_t i=0; i<count; ++i) 

        std::cout << A::data[i] << "\n";

}


查看完整回答
反對 回復(fù) 2019-08-30
?
弒天下

TA貢獻(xiàn)1818條經(jīng)驗 獲得超8個贊

那么你的要求是如此模糊,很難對它們采取任何行動......主要問題當(dāng)然是:這些價值來自哪里?


無論如何,C ++中的構(gòu)建可以被認(rèn)為是4個步驟:


預(yù)構(gòu)建步驟:從其他格式生成頭/源的腳本

預(yù)處理

模板實(shí)例化

編譯正確

如果您希望排除腳本生成,那么您將有兩種選擇:預(yù)處理和元模板編程。


我不知道元模板編程在這里可以做到這一點(diǎn),因為據(jù)我所知,在編譯時不可能連接兩個數(shù)組。因此,我們留下了當(dāng)時的救星:預(yù)處理程序編程


我建議使用一個完整的庫來幫助我們:Boost.Preprocessor。


特別感興趣的是:


BOOST_PP_FOR

BOOST_PP_REPEAT

現(xiàn)在,只要我們知道從哪里挑選價值,我們就可以給出更有意義的例子。


查看完整回答
反對 回復(fù) 2019-08-30
?
慕虎7371278

TA貢獻(xiàn)1802條經(jīng)驗 獲得超4個贊

如何使用模板構(gòu)建嵌套結(jié)構(gòu),并將其轉(zhuǎn)換為正確類型的數(shù)組。下面的例子適用于我,但我有一種感覺,我要么正在踩踏,要么走得非常接近未定義的行為。


#include <iostream>


template<int N>

struct NestedStruct

{

  NestedStruct<N-1> contained;

  int i;

  NestedStruct<N>() : i(N) {}

};


template<>

struct NestedStruct<0> 

{

  int i;

  NestedStruct<0>() : i(0) {}

};


int main()

{

  NestedStruct<10> f;

  int *array = reinterpret_cast<int*>(&f);

  for(unsigned int i=0;i<10;++i)

  {

    std::cout<<array[i]<<std::endl;

  }

}

當(dāng)然你可能會爭辯說數(shù)組在編譯時沒有初始化(我認(rèn)為這是不可能的)但是進(jìn)入數(shù)組的值是在編譯時計算的,你可以像普通數(shù)組那樣訪問它們。我認(rèn)為那是你能得到的盡可能接近的。


查看完整回答
反對 回復(fù) 2019-08-30
  • 3 回答
  • 0 關(guān)注
  • 574 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號