Использование boost :: mpl :: vector для создания шаблонов с переменными параметрами? - PullRequest
1 голос
/ 08 марта 2012

Сейчас я застрял с C ++ 03 и хочу создать глобальную функцию, которая принимает любое количество типобезопасных аргументов (до разумного предела, если необходимо, например, 9).

У меня есть доступ к библиотеке полного буста в моей базе кода, поэтому я надеюсь, что boost::mpl::vector может быть полезен здесь.Я также не хочу, чтобы это было слишком неудобно писать.Синтаксис на сайте вызова должен быть простым, например, так:

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

Каков наилучший способ реализовать это безопасным способом?

EDIT

Iтакже понимаю, что я мог бы использовать для этого специализацию шаблонов, но я не хочу в конечном итоге определять одну и ту же структуру 9 раз, по одному для каждого дополнительного параметра шаблона.Это слишком грязно для этого.Я бы хотел этого избежать, если это вообще возможно.

1 Ответ

1 голос
/ 08 марта 2012

Лучше всего было бы 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.

...