#include <iostream>
using namespace std;
template<typename T>
void print_comma_separated_list(const T& value) {
std::cout<<value<<std::endl;
}
template<typename First,typename ... Rest>
void print_comma_separated_list(const First& first,Rest ... rest) {
std::cout<<first<<",";
print_comma_separated_list(rest...);
}
int main()
{
print_comma_separated_list(42,"hello",2.3,'a');
print_comma_separated_list("hello",2.3,'a');
print_comma_separated_list(2.3,'a');
print_comma_separated_list('a');
return 0;
}
#include <stdexcept>
#include <iostream>
using namespace std;
void mprintf(const char* s)
{
while (*s) {
if (*s == '%' && *(++s) != '%')
throw std::runtime_error("invalid format string: missing arguments");
std::cout << *s++;
}
}
template<typename T, typename... Args>
void mprintf(const char* s, T value, Args... args)
{
while (*s) {
if (*s == '%' && *(++s) != '%') {
std::cout << value;
mprintf(s, args...); // call even when *s == 0 to detect extra arguments
return;
}
std::cout << *s++;
}
throw std::logic_error("extra arguments provided to printf");
}
int main(int argc, char** argv) {
std::string s("test");
std::string s2("test2");
mprintf("% - %", s, s2);
return 0;
}