Header-only class for filling strings with formatted arguments (C++11).
The format specifier is '%?'. Arguments are output into string in the same way as into 'std::cout'.
It is possible to manipulate with format flags and settings for output via following methods:
Flags, Precision, Imbue, SetF, UnSetF (analogues of flags, precision, imbue, setf, and unsetf for ios_base)
#include <iostream>
#include <list>
#include <map>
#include "format_util.h"
struct X {}; // does not have operator<<
struct Y {}; // has operator<<
std::ostream& operator<<(std::ostream& os, const Y&)
{
    os << "Type Y";
    return os;
}
int main()
{
    Formatter formatter;
    std::cout << formatter.Format("Number: %?, string: %?", 100.1, "abc") << std::endl;
    int num_i = 10;
    double num_d = 20.5;
    std::string example_num = "Integer value: %?, double value: %?, wrong odd arguments: %?, %?, %?";
    std::cout << formatter.Format(example_num, num_i, num_d) << std::endl;
    std::list<std::string> fruits = { "apple", "pear", "banana" };
    std::cout << formatter.Format("List of %? elements: %?", fruits.size(), fruits) << std::endl;
    std::map<double, bool> map_example = { {2.0, true}, {4.5, false}, {8, true} };
    std::cout << formatter.Format("Map of %? elements: %?", map_example.size(), map_example) << std::endl;
    X x;
    Y y;
    std::cout << formatter.Format("Unknown type is shown as '%?', known type example: '%?'", x, y) << std::endl;
    return 0;
}Number: 100.1, string: abc
Integer value: 10, double value: 20.5, wrong odd arguments: ?, ?, ?
List of 3 elements: [apple, pear, banana]
Map of 3 elements: [{2 : true}, {4.5 : false}, {8 : true}]
Unknown type is shown as '?', known type example: 'Type Y'