>>
|
No. 396
Генератор враппера
#!/usr/bin/python
import sys;
def make_separated_list(list, function, comma ):
""" Build string that consist of <comma>-separated <list>'s values"""
return "".join( function(j) + comma for j in list[:-1] ) + function(list[-1])
def generate( counter ):
# header
print """
#ifndef INCLUDED_stringof
#define INCLUDED_stringof
#include <string>
#include <sstream>
"""
# body
for items in [ range(1,i+1) for i in xrange(1,counter+1) ]:
template_arguments = make_separated_list(items, (lambda z: "class C%d" % z ), ", ")
function_arguments = make_separated_list(items, (lambda z: "const C%d& c%d" % (z,z)) , ", " )
elements_to_stream = make_separated_list(items, (lambda z: "c%d" % (z)) , " << " )
print """
template<%(template_arguments)s>
std::string stringof( %(function_arguments)s )
{
std::ostringstream oss;
oss << %(elements_to_stream)s;
return oss.str();
}
""" % locals(),
# footer
print "#endif"
items = 20
if len(sys.argv) > 1 :
items = int( sys.argv[1] )
generate( items )
Генерирует
template< class C1 >
std::string stringof( const C1& c1 ) {
std::ostringstream oss;
oss << c1;
return oss.str();
}
template< class C1, class C2 >
std::string stringof( const C1& c1, const C2& c2 ) {
std::ostringstream oss;
oss << c1 << c2;
return oss.str();
}...
используется для
throw std::logic_error(stringof(42, "это серьезно"));
и для
cout << stringof("x:", x, "y:",y).
вообщем всегда когда надо строку слепить из нескольких элементов.
Никогда не использую stream'ы без враппирования в sstringstream потому что
#include <iostream>
#include <iomanip>
using namespace std;
void printSomething() {
cout << 100 << " интернетов осталось
";
}
void debug() {
cout << "flags: " << setbase(16) << 123 << "
";
}
int main() {
printSomething();
debug();
printSomething();
}
печает
> 100 интернетов осталось
> flags: 7b
> 64 интернетов осталось
в результате чего может возникнуть вопрос "куда делись 36 интернетов"
|