噓 changhua5566:我想你也沒被豬噓過01/16 21:40
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.205.229
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1492685077.A.6B4.html
※ 編輯: ofd168 (60.250.205.229), 04/20/2017 18:49:37
→ pttworld: 寫在參數式 04/20 20:03
噓 Sidney0503: VLA是C99接受的語法 C++一直以來都不接受 04/20 22:44
→ Sidney0503: g++是送你extension 反而說照規範的東西爛? 04/20 22:44
→ Sidney0503: 一樣想要一行可以有vector::size(); 04/20 22:45
噓 Sidney0503: 你怎麼不抱怨為什麼c語言沒有move和lambda? 04/20 22:47
不知道為何s大這麼生氣
我只覺得這條路如果走不通就只能想別條路,所以想詢問有沒有其他解法
如果在一個structure中定義許多靜態配置的變數,
若要將structure寫入檔案中儲存,可以使用fwrite簡單的一行儲存
而不用對structure中各自變數去做個別儲存,方便很多
目前是遇到,如果在structure中是宣告指標/vector再去配置空間
好像沒辦法使用fwrite與sizeof簡單存入檔案中
必須要個別處理
所以才想問有沒有可以簡單儲存的前提下,讓我的array長度的變數
能夠放在其他structure呢?
比如 以下這種希望的效果,但是語法上不合
struct A_{
const int array_size = 10;
} A;
struct B{
int array[A.array_size];
};
目前看起來也許這樣比較可行
namespace A{
const int array_size = 10;
};
struct B{
int array[A::array_size];
};
讓人一樣知道array_size宣告在哪裡
可是如果我想把A裡面所有變數儲存,就必須每個變數都各別處裡
如果未來增加變數,寫入檔案的function也必須同步修改
不知道有沒有比較好的方法呢
※ 編輯: ofd168 (123.195.57.89), 04/21/2017 00:48:54
修改一下內文
推 Sidney0503: fwrite是C語法 你堅持要用就是請你換c compiler而不 04/21 01:04
→ Sidney0503: 是c++ compiler 04/21 01:04
→ Sidney0503: c++寫入檔案推薦的方法有ofstream 04/21 01:07
→ Sidney0503: 連size都不需要 04/21 01:07
好,我研究一下
→ pnpncat: 以 c++ 的觀點來看,如果你需要的是一個靜態的參數 04/21 01:38
→ pnpncat: 為什麼不用 template 參數呢? 04/21 01:39
用template好像可以
如果需要的變數很多的時候,宣告的時候貌似會很大坨@@?
→ fatrabitree: 你應該連參數都用讀檔的,不然改參數就重新編譯一次 04/21 07:13
→ fatrabitree: ? 04/21 07:13
!! 這好像也是可行的方案
※ 編輯: ofd168 (60.250.205.229), 04/21/2017 10:30:05
推 ronin728: CLion 表示 : 04/21 10:49
→ pnpncat: 把靜態參數和動態參數分開 靜態才放template參數 04/21 12:25
→ pnpncat: 動態的用class成員和set函數去做 如果template參數還是 04/21 12:25
→ pnpncat: 很多 就用另其他template把參數分組打包起來然後typedef 04/21 12:26
→ pnpncat: 這樣應該就沒問題了 04/21 12:27
→ pnpncat: 另一個方法是先寫 class Parameters 來存參數 04/21 12:29
→ pnpncat: 然後再用 template<Parameters p> class Setting; 來將 04/21 12:30
→ pnpncat: 它靜態化 04/21 12:30
→ pnpncat: 推文好麻煩 我回信給你好了 04/21 12:33
感謝p大直接寄信教學
目前CODE寫起來如下
http://codepad.org/yVhrAu4Q
class Parameters {
public:
const static int size1 = 10;
const static int size2 = 20;
};
template <typename Parameters>
class testClass
{
int Arr1[Parameters::size1];
int Arr2[Parameters::size2];
};
int main()
{
testClass<Parameters> testObj;
printf("testClass size = %d\n", sizeof(testObj));
system("PAUSE");
return 0;
}
VC2015是可以跑得
不過
1. 用codepad說有 Disallowed system call: SYS_fork
這樣是代表有風險嗎?
2. 另外覺得template <typename Parameters> 這段有點風險
因為從這行並沒有限定要是 Parameters 這個class
看stackoverflow的這篇
Passing a structure as a template-parameter - How can I fix this code?
https://goo.gl/L7OWWE
他是使用 template <Parameters const& p> 這種做法
不過當我嘗試使用時候,就會跑出一堆error
http://codepad.org/FOcqxCch
3. 雖然這個parameter可存檔,而且一樣讓使用的人知道這個變數放哪
比如Parameter::size1, 雖然這部分就是2的問題,覺得有點怪怪的
發現最後一的問題,好像不能讀 XDDDDD
原本做法是 把parameter object存入檔案,要讀的時候就直接讀檔並直接蓋掉
parameter的object, 在debug mode就可以看到各個變數讀出來的值。
改成這種作法,就跟使用namespace好像差不多了,不過優點是因為可以存
想說要求Parameter裡面所有變數都是double,讀的時候放在一個double array
此array的長度就可以利用sizeof(parameter)來得到
缺點是無法很容易地知道 這個double array某一個elemet對應的Parameter是
哪個變數,不過總歸是個解法
※ 編輯: ofd168 (60.250.205.229), 04/21/2017 16:10:16
推 LPH66: codepad 那個單純只是不給你用 system 而已 04/21 17:04
→ pnpncat: 想要把參數存成可讀檔的話就用個小技巧存一份在物件中: 04/21 20:02
→ pnpncat: struct Parameters { 04/21 20:02
→ pnpncat: enum{SIZE_1 = 10}; 04/21 20:02
→ pnpncat: enum{SIZE_2 = 20}; 04/21 20:03
→ pnpncat: int size1; 04/21 20:03
→ pnpncat: int size2; 04/21 20:03
→ pnpncat: Parameters() : size1(SIZE_1), size2(SIZE_2) {} 04/21 20:03
→ pnpncat: }; 04/21 20:03
→ pnpncat: 讓編譯器讀SIZE_1, SIZE_2 你讀size1, size2 04/21 20:05
→ pnpncat: 剛剛在自己的機器上跑過沒問題 04/21 20:10