Как я могу гарантировать безопасность типов в функции, которая принимает неограниченное количество аргументов?
Библиотека FastFormat работает так:
string example;
fastformat::fmt(example, "I am asking {0} question on {1}", 1, "stackru");
Он также утверждает, что "100% безопасность типов". Я могу понять, как другие библиотеки, такие как boost::format
достичь этого путем перегрузки operator%
, то, что я делаю довольно часто с моим кодом тоже.
Но если бы я мог использовать запятую вместо этого, это было бы менее удивительно для других программистов. Мне действительно любопытно узнать, как я могу гарантировать безопасность типов без хитрого трюка с перегрузкой оператора.
Помимо примечания: в случае, если вам интересно, что такое "шаблонный трюк перегрузки операторов", вот как работает boost::format (в основном):
struct Test
{
template<class T>
Test& operator%(const T& what) { cout << what << "\n" /* Example */; return *this; }
};
Test() % 5 % "abc";
1 ответ
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 вы сможете иметь неограниченное (ну, практически неограниченное) количество аргументов и безопасность типов с помощью шаблонов с переменным числом аргументов.