template<
    typename output_policy,
    typename language_policy
>
class HelloWorld
  : public output_policy,
    public language_policy
{
    using output_policy::Print;
    using language_policy::Message;
 
public:
 
    //behaviour method
    void Run()
    {
        //two policy methods
        Print( Message() );
    }
 
};
 
 
#include <iostream>
 
class HelloWorld_OutputPolicy_WriteToCout
{
protected:
 
    template< typename message_type >
    void Print( message_type message )
    {
        std::cout << message << std::endl;
    }
 
};
 
 
#include <string>
 
class HelloWorld_LanguagePolicy_English
{
protected:
 
    std::string Message()
    {
        return "Hello, World!";
    }
 
};
 
class HelloWorld_LanguagePolicy_German{
protected:
 
    std::string Message()
    {
        return "Hallo Welt!";
    }
 
};
 
 
int main()
{
 
/* example 1 */
 
    typedef
        HelloWorld<
            HelloWorld_OutputPolicy_WriteToCout,
            HelloWorld_LanguagePolicy_English
        >
            my_hello_world_type;
 
    my_hello_world_type hello_world;
    hello_world.Run(); //returns Hello World!
 
 
/* example 2 
 * does the same but uses another policy, the language has changed
 */
 
    typedef
        HelloWorld<
            HelloWorld_OutputPolicy_WriteToCout,
            HelloWorld_LanguagePolicy_German
        >
            my_other_hello_world_type;
 
    my_other_hello_world_type hello_world2;
    hello_world2.Run(); //returns Hallo Welt!
}
Posted by 셈말짓기 :