dzieki, ale tak się nie da, nie o to chodzi.
obszedłem to:
//h:
class Reporter
{
public:
Reporter(const char *name) ;
Reporter(const char *funcName, int lineNumber, const char *fileName) ;
~Reporter() ; //not virtual
protected:
std::string getName()const ;
private:
const std::string nameOfBlock ;
const std::string createNameOfBlock(const char *funcName, int lineNumber, const char *fileName) ;
};
inline std::string Reporter::getName()const
{
return nameOfBlock;
}
#define REPORTER(x) RROut::Reporter x((__func__),(__LINE__),(__FILE__))
//cpp:
Reporter::Reporter(const char *name):nameOfBlock(name)
{
rrout<<nameOfBlock<<" BEGIN\n" ;
}
Reporter::Reporter(const char *funcName, int lineNumber, const char *fileName):
nameOfBlock(createNameOfBlock(funcName,lineNumber,fileName))
{
rrout<<nameOfBlock<<" BEGIN\n" ;
}
Reporter::~Reporter()
{
rrout<<nameOfBlock<<" END\n" ;
}
const std::string Reporter::createNameOfBlock(const char *funcName, int lineNumber, const char *fileName)
{
std::ostringstream oss ;
oss<<funcName<<", line "<<lineNumber<<" in "<<fileName;
return oss.str() ;
}
działa to tak, że jeśli napiszę:
#include <iostream>
#include "reporter.h"
void fun(int a)
{
REPORTER(nazwajakas) ;
std::cout<<"a == "<<a<<"\n" ;
}
int main(int argc, char **argv)
{
REPORTER(repMain) ;
fun(6);
fun(0);
return 0 ;
}
to dostaję:
main, line 12 in p3_4p.cpp BEGIN
fun, line 6 in p3_4p.cpp BEGIN
a == 6
fun, line 6 in p3_4p.cpp END
fun, line 6 in p3_4p.cpp BEGIN
a == 0
fun, line 6 in p3_4p.cpp END
main, line 12 in p3_4p.cpp END
a chciałbym nie tworzyć tego konstruktora z 3 argumentami w klasie Reporter, tylko zostawić 1 argumentowy przyjmujący tylko nazwę, a cała składnia "funkja, line xxx in plik.cpp" miałaby być tworzona przez makro. jak ktoś wie jak to zrobić, to wielkie dzięki
pozdrawiam