Variadic templates для user defined literals

dix75
dix75

В качестве аргумента приведу пример того, что хотел бы увидеть лично я. Создать функцию, которая принимала бы произвольное кол-во параметров. (аналог printf).

template<class... Args>
constexpr std::string operator "" _print(std::string cosnt& format, Args&&... args)  {
    //...
}
// usage
void main() {
   std::cout << "cool %i\n"_print(10);
   std::cout << "cool %i = %s\n"_print(10, "strange"s);
   return EXIT_SUCCESS:
}

Также можно было бы написать свой простой json и xml writer к примеру.

-2
рейтинг
3 комментария
yndx-antoshkka
А подобный подход вас утроит:

template<class... Args>
std::string operator % (const std::string& format, const std::tuple<Args...>& args) {
return /* ... */;
}
// usage
int main() {
using namespace std::literals;
std::cout << "cool %i\n" % std::make_tuple(10);
std::cout << "cool %i = %s\n" % std::make_tuple(10, "strange"s);
}
yndx-antoshkka
dix75
yndx-antoshkka,
Как вариант, конечно да. Я эту проблему решаю имеено так, но здесь нет красоты.
Постоянно писать std::make_tuple утомительно.
Очень часто приходится писать небольшие print, json, xml и другие выводы в поток в файл и др.
И таким образом будет понятно, что я хочу сделать:
"{ name: %1 }"._json(Object);
"<name>%1</name>"._xml(Object);
"name is %1"._print(Object);
dix75
yndx-antoshkka
о! А вот так:

struct my_string_view {
const char* data;

template <class... Args>
std::string operator()(Args&&... args) const {
return /* ... */;
}
};

constexpr my_string_view operator "" _print(const char* format, std::size_t) {
return {format};
}

Тогда получается что ваш синтаксис работает:
// usage
int main() {
using namespace std::literals;
std::cout << "cool %i\n"_print(10);
std::cout << "cool %i = %s\n"_print(10, "strange"s);
}
yndx-antoshkka
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).