簡體   English   中英

使用boost :: mpl :: vector創建可變參數模板?

[英]Using boost::mpl::vector to create variadic templates?

我暫時還停留在C ++ 03上,我想創建一個全局函數,該函數接受任意數量的類型安全參數(必要時可以達到合理的限制,例如9)。

我可以在我的代碼庫中訪問完整的boost庫,因此我希望boost::mpl::vector在這里有用。 我也不希望這樣寫起來不方便。 呼叫站點的語法應該很簡單,如下所示:

LogDebugMessage("Number of cats and dogs:", m_myPets->NumCats(), m_myPets->NumDogs());

以類型安全的方式實現此目標的最佳方法是什么?

編輯

我也意識到我可以為此使用模板專用化,但是我不想最終定義相同的結構9次,每個其他模板參數定義一次。 這太混亂了。 我想盡可能避免這種情況。

最好的方法是9個重載。 :P

但是,最簡單的方法是boost::tuple而不是使用boost::mpl ,因為mpl大多只是編譯時。 呼叫站點(用戶)隨后會寫類似

LogDebugMessage("Number of cats and dogs:",
    boost::tie(m_myPets->NumCats(), m_myPets->NumDogs()));

tie創建引用的元組。 或如果呼叫涉及臨時人員:

LogDebugMessage("Number of cats, dogs and birds:",
    boost::make_tuple(m_myPets->NumCats(), m_myPets->NumDogs(), 0));

如果記錄的類型比較重( boost::make_tuple復制),則可以使用舊的boost::ref

然后您的LogDebugMessage看起來像這樣:

template<class Tuple>
void LogDebugMessage(std::string const& msg, Tuple const& args);

之后,您可以使用類似於我的tuple打印機的遞歸來打開tuple的包裝。 請注意,只有operator<<實際上使用可變參數模板,並且這樣做只是為了拾取std::tuple 您很可能只使用print_tuple部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM