Как я могу гарантировать безопасность типов в функции, которая принимает неограниченное количество аргументов? - PullRequest
4 голосов
/ 23 сентября 2010

Библиотека FastFormat работает следующим образом:

string example;
fastformat::fmt(example, "I am asking {0} question on {1}", 1, "stackoverflow");

Она также заявляет о 100% -ной безопасности типов.Я могу понять, как другие библиотеки, такие как boost::format, достигают этого путем перегрузки operator%, что я тоже довольно часто делаю со своим кодом.

Но если бы я мог вместо этого использовать запятую, было бы менее удивительнодругие программисты.Мне действительно любопытно узнать, как я могу гарантировать безопасность типов без уловки перегрузки оператора по шаблону.


Помимо примечания: в случае, если вам интересно, что такое «уловка перегрузки оператора по шаблону», это то, как повысить:: формат работы (в основном):

struct Test
{
    template<class T>
    Test& operator%(const T& what) { cout << what << "\n" /* Example */; return *this; }
};

Test() % 5 % "abc";

1 Ответ

6 голосов
/ 23 сентября 2010

fastformat::fmt() не принимает неограниченное количество аргументов. Есть только несколько перегрузок, которые принимают фиксированное количество аргументов. Например, перегрузки могут выглядеть следующим образом:

template <typename T0>
std::string fmt(const std::string& format_str, const T0& arg0);

template <typename T0, typename T1>
std::string fmt(const std::string& format_str, const T0& arg0, const T1& arg1);

// etc. for more numbers of arguments

Когда вы используете fmt(), происходит разрешение перегрузки для выбора функции с правильным количеством аргументов.

Вам нужно проверить в документации количество поддерживаемых аргументов, но это определенно не неограниченное число.

В C ++ 0x вы сможете иметь неограниченное (ну, практически неограниченное) количество аргументов и безопасность типов с помощью шаблонов с переменными числами.

...