Avatar billede karas Nybegynder
16. juni 2009 - 19:47 Der er 2 kommentarer og
1 løsning

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?
Avatar billede karas Nybegynder
16. juni 2009 - 19:51 #1
PS: Grunden til at jeg bruger en struct til at pakke 'log settings' ind med er for at undgå at man skal give mere end en template parameter til 'logger'. Jeg godtager derfor ikke et svar som blot giver de individuelle settings direkte til 'logger'.
Avatar billede karas Nybegynder
16. juni 2009 - 19:59 #2
Det er typisk. Så snart man har spurgt om råd, så går løsningen op for en...

template<class S>
class logger
{
public:
    void onHelloWorld() const { m_impl.onHelloWorld(); }

private:
    logger_impl<S::enable> m_impl; // <- OK!
};
Avatar billede languy Nybegynder
30. juni 2009 - 10:49 #3
Overvej at bruge nedarvning i stedet for template. Det sikre en bedre strukturering af dit program og du har bedre muligheder for at definere de enkelte kontrakter.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester