Go back to Richel Bilderbeek's homepage.

Go back to Richel Bilderbeek's C++ page.

 

 

 

 

 

( C++ ) Policy

 

A policy is a class behaviour set at compile-time.

 

A policy consts of a host class and policy classes. The user of a policy chooses which policy class is used, by template.

 

A policy class is a b ase class. All base class destructors should be public and virtual, or protected and nonvirtual' [0] . The destructor of a policy class should be protected and nonvirtual [1] .

 

 

 

 

 

Example

 

During debugging, you might want to trace (keep track of) variables.

Sometimes, you might want to write it to std::cout, file or other ways.

The example below shows a Tracer class, whose behavior is set at compile-time.

 

 

#include <iostream>

#include <fstream>

#include <string>

 

template <typename OutputPolicy>

struct Tracer : public OutputPolicy

{

 

};

 

struct OutputPolicyCout

{

void Trace(const std::string& s)

{

std::cout << s << '\n';

}

 

protected:

~OutputPolicyCout()

{

// The destructor of a policy class should be protected and non-virtual [1] .

}

};

 

struct OutputPolicyFile

{

OutputPolicyFile() : m_file("Trace.txt")

{

 

}

void Trace(const std::string& s)

{

m_file << s << '\n';

}

std::ofstream m_file;

 

protected:

~OutputPolicyFile()

{

// The destructor of a policy class should be protected and non-virtual [1] .

}

};

 

 

int main()

{

Tracer<OutputPolicyCout> p1;

Tracer<OutputPolicyFile> p2;

p1.Trace("x");

p2.Trace("x");

}

 

 

In this example, Tracer is the host class, where OutputPolicyCout and OutputPolicyFile are policy classes.

 

Note that p1 and p2 have types as different as std::vectors with different elements.

 

 

 

 

 

References

  • Herb Sutter , Andrei Alexandrescu. C++ coding standards: 101 rules, guidelines, and best practices. ISBN: 0-32-111358-6. Item 50: 'Make base class destructors public and virtual, or protected and nonvirtual'.

    [1]          Andrei Alexandrescu . Modern C++ Design. 2001. ISBN: 0201704315.

     

     

     

     

     

    Go back to Richel Bilderbeek's C++ page.

    Go back to Richel Bilderbeek's homepage.