c 模板程式設計應該把實現放在標頭檔案中嗎,這樣寫會不會讓標頭檔案變得很難看?

時間 2021-05-10 09:05:01

1樓:Kendy

實現是可以寫在cpp中的,但是使用時需要在cpp中再特例化宣告一遍。例如想用到乙個c++17的enum庫,但是整個工程只支援C++11的,只想用到那個enum庫的cpp檔案用C++17編譯,這時就需要在該cpp檔案裡面去實現了:

//myenum.h

template

extern T g_GetEnumValue(const std::string& str);

//myenum.cpp

#include "myenum.h"

#include "magic_enum.hpp" //這個標頭檔案是c++17的,如果在.h包含那麼會導致其他C++11的cpp包含了該頭都會報錯

#include "myenum_defs.h" //這個標頭檔案包含了一些enum的定義,例如MyEnum

template

T g_GetEnumValue(const std::string& str)

//要特例化宣告模板:

template MyEnum g_GetEnumValue(const std::string& str);

這樣,就可以在其他cpp裡面包含myenum.h,使用 MyEnum g_GetEnumValue(const std::string& str);這個函式了。

如果要轉其他Enum,需要繼續新增特例化宣告。

2樓:YZRUS

乙個標頭檔案 .h

乙個模板實現檔案.hpp

乙個普通實現.cpp

.h檔案最後一行 include .hpp檔案PCL點雲庫就是這麼弄的感覺還是蠻清晰的

3樓:exiledkingcc

template實現一般都是放在標頭檔案裡面。不然,使用者沒辦法例項化。

至於難不難看,那是見仁見智。可以先把介面寫在一起,實現放在後面,這樣會好一些。

C 模板程式設計時為什麼會出現這種奇怪的行為?

暮無井見鈴 題外話 或許你需要的是乙個取反器 C 11 template Fn class notter template Args auto operator Args arg decltype fobj std forward arg notter const notter default no...

C語言能否通過結構體實現物件導向程式設計?

藍彼得 能!而且在有些嵌入式系統裡就是這麼做的,因為效能和資源。實際上物件導向語言最終也是通過過程式語言來實現的。用C語言實現物件導向,首先要手動的構建一些基礎設施,比如你要有乙個基類,用巨集 結構和函式指標來封裝基本的物件導向功能。繼承乙個類要遵循你自己定義的程式設計規範,基本上就是繼承父類的結構...

怎麼把C 的併發程式設計玩出花來?

想要花就需要你自己搞一套庫,設計一套與眾不同的風格,不過再花不也不可能比executors更花 timed single thread context context 乙個支援定時器的執行緒 auto scheduler context.get scheduler std atomic count ...