Templates
Hej, her er en lille udfording inden for templates:Jeg ønsker at lave logging af bestemte events. Da der ikke vil blive tilføjet ret mange events og da man skal kunne parse event-loggen bagefter, så forestiller jeg mig at det smarteste er at lave en klasse som kan printe event-loggen. Hver event får så en tilhørende member funktion i klassen (fx logger::onEventFoo(arg1, arg2)).
Det næste krav til løsningen er at der ikke må benyttes macro'er til at enable/disable logging, men at man derimod skal kunne enable/disable logging compile-time ved hjælp af templates.
Jeg havde en idé til hvordan det kunne gøres, men det viser sig at det ikke kan kompilere (gcc 4.4.0):
#include <iostream>
struct log_on
{
static const bool enable = true;
// Other logging settings go here
};
struct log_off
{
static const bool enable = false;
// Other logging settings go here
};
template<bool>
class logger_impl;
template<>
class logger_impl<false>
{
public:
void onHelloWorld() const {}
};
template<>
class logger_impl<true>
{
public:
void onHelloWorld() const
{
std::clog << "Hello World! printed" << std::endl;
}
};
template<class S>
class logger
{
public:
void onHelloWorld() const { m_impl.onHelloWorld(); }
private:
logger_impl<typename S::enable> m_impl; // <- Error
};
int main(int argc, char* argv[])
{
#if 1
logger<log_on> l;
#else
logger<log_off> l;
#endif
std::cout << "Hello World!" << std::endl;
l.onHelloWorld();
return 0;
}
-----------
Det giver følgende fejl:
main.cpp:43: error: type/value mismatch at argument 1 in template parameter list for ‘template<bool <anonymous> > struct logger_impl'
main.cpp:43: error: expected a constant of type ‘bool', got ‘typename S::enable'
main.cpp: In member function ‘void logger<S>::onHelloWorld() const':
main.cpp:40: error: request for member ‘onHelloWorld' in ‘((const logger<S>*)this)->logger<S>::m_impl', which is of non-class type ‘const int'
Har du en god ide til hvad jeg kan gøre anderledes?