2010-05-09 110 views
5

GCC高達4.5沒有標準C++ 0x類型特徵模板has_nothrow_move_constructor。我可以在我的包中使用它進行優化,但我不想排除其中一種常見編譯器,也不希望使用像HAVE_STD_HAS_NOTHROW_MOVE_CONSTRUCTOR這樣的符號來重載配置。是否有可能使用該模板(如果存在),並且如果不存在而不是,則使用任何預定義的配置符號回退到複製?我也不想依賴Boost,因爲我的庫很小,不需要任何其他原因的Boost。在編譯時檢測模板存在

僞代碼,我需要的是這樣的:

template <typename type> 
struct has_nothrow_move_constructor_robust 
    : public integral_constant <bool, 
      /* if possible */ has_nothrow_move_constructor <type>::value 
      /* otherwise */ false> 
{ }; 

由於move構造函數只對的C++ 0x無論如何,如果我不介意使用其他的C++ 0x的上述定義的功能,所有可能的。

+3

大多數Boost是在頭文件中實現的,而不是在對象文件中實現的。因此,如果你堅持這些,那麼對於你不使用的東西 - 對於你所使用的大多數東西 - 對於這個問題,你都不會支付大小的懲罰。 – 2010-05-09 15:25:02

+0

更多的是依賴(即使幾乎每個人都使用Boost)。也許我可以撕掉Boost的相關部分,但是因爲我的圖書館總是像3頭... – doublep 2010-05-09 15:42:20

+0

似乎很難檢查一個類型是否存在。但是,如果沒有移動構造函數,C++ 0x通常不會自動回退到複製?或者,如果缺乏部分很重要,難道想象一個複製比移動更安全的課程(如果後者沒有被標記爲不移動)是不是很難? – UncleBens 2010-05-09 20:29:48

回答

1

boost::variant有一個has_nothrow_move自己內部使用的實現 - 你可以使用它,雖然它不如一個正確的編譯器實現那樣可靠。它的來源是here - 我不知道它有多可靠,所以YMMV。

除此之外,您可以測試編譯器版本宏(__GNUC__ and __GNUC_MINOR__)以確定存在性,如果不存在則將其存根。不幸的是,似乎has_nothrow_move_constructor在G ++的任何發佈版本中都不被支持,所以在你知道使用正確的版本之前,你必須等一下。