Лучше всего было бы 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);
И после этого вы распаковываете кортеж, используя рекурсию, аналогичную моему принтеру кортежей . Обратите внимание, что только operator<<
на самом деле использует шаблоны с переменным числом аргументов и делает это только для получения std::tuple
. Скорее всего, вы будете использовать только часть print_tuple
.