fmtlib
имеет такие функции, как:
template <typename S, typename... Args, typename Char = char_t<S>>
inline std::basic_string<Char> format(const S& format_str, Args&&... args) {
return internal::vformat(
to_string_view(format_str),
{internal::make_args_checked<Args...>(format_str, args...)});
}
Я определил макрос для своего удобства, например:
#define FMT fmt::format
Я использую это как:
std::cout<<FMT("Name: {0}\n", "Joe");
Есть ли альтернатива использованию макроса для этого в С++ 11, желательно такая, которая не влияет на производительность?
Отдайте предпочтение using fmt::format
.
хмммм, не могли бы вы предоставить минимальный воспроизводимый пример, который облегчит демонстрацию решения вашей проблемы?
Да: не используйте макросы или другие способы давать вещам короткие загадочные имена. Вместо этого используйте длинные описательные имена. Длинные имена — ваши друзья.
Вы можете определить ту же функцию с более коротким именем (в своем собственном коде). Эта функция называется FMT()
и передает свои параметры в fmt::format()
, которая является исходной функцией, которую вы хотите вызвать:
template <typename S, typename... Args, typename Char = fmt::char_t<S>>
inline std::basic_string<Char> FMT(const S& format_str, Args&&... args) {
return fmt::format(format_str, std::forward<Args>(args)...);
}
Извините, я должен спросить об этом, прежде чем голосовать, поскольку я не поклонник ответов только для кода... Но с объяснением я намерен проголосовать за радость от того, что узнал что-то (после того, как был совершенно не прав публично.... ; -) ).
Если вы хотите ввести символ из пространства имен, вы можете использовать using
.
Если вы хотите упростить ввод псевдонима для функции, вы можете использовать auto&
, auto
, auto&&
или auto const&
.
Или вы можете использовать оболочку лямбды.
На мой взгляд, любой из них лучше, чем функциональный макрос.
#include <iostream>
using std::cout;
namespace Happy {
void Joy();
void Joy() {
cout << "Joy and pride!\n";
}
} // Happy
int main() {
// Example of using.
using Happy::Joy;
Joy();
// Example of aliasing.
auto& pride = Happy::Joy;
auto pride2 = Happy::Joy;
auto&& pride3 = Happy::Joy;
auto const& pride4 = &Happy::Joy;
pride();
pride2();
pride3();
pride4();
// Example of wrapping in a lambda.
auto lambda = []{ Happy::Joy(); };
lambda();
}
используя пространство имен fmt?