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

Библиотека 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 вы сможете иметь неограниченное (ну, практически неограниченное) количество аргументов и безопасность типов с помощью шаблонов с переменным числом аргументов.

Другие вопросы по тегам