[英]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.