Statyczny polimorfizm

Statyczny polimorfizm#

Statyczny polimorfizm to technika programowania, która pozwala na wybór zachowania w czasie kompilacji. W C++ statyczny polimorfizm jest realizowany za pomocą szablonów klas.

Zalety statycznego polimorfizmu:

  • lepsza wydajność w porównaniu do dynamicznego polimorfizmu (nie ma kosztów związanych z wywołaniem funkcji wirtualnych)

  • brak konieczności dziedziczenia po klasie bazowej - klasa musi jedynie posiadać odpowiednie metody

Wadą statycznego polimorfizmu jest jego statyczność - wybór zachowania odbywa się w czasie kompilacji, co oznacza, że nie można zmienić zachowania w czasie działania programu.

struct UpperCaseFormatter
{
    std::string format(const std::string& message) const
    {
        std::string result = message;
        std::transform(result.begin(), result.end(), 
                       result.begin(), [](char c) { return std::toupper(c); });   
        return result;
    }
};

struct CapitalizeFormatter
{
    std::string format(const std::string& message) const
    {
        std::string result = message;
        result[0] = std::toupper(result[0]);
        return result;
    }
};

template <typename TFormatter = UpperCaseFormatter>
class Logger 
{
    TFormatter formatter_;
public:   
    Logger() = default;

    Logger(TFormatter formatter)
        : formatter_(std::move(formatter))
    {
    }

    void log(const std::string& message)
    {        
        std::cout << formatter_.format(message) << std::endl;
    }
};
Logger<UpperCaseFormatter> upper_case_logger;
upper_case_logger.log("this is a sample message");

Logger<CapitalizeFormatter> capitalize_logger;
capitalize_logger.log("this is a sample message");

Logger<> default_logger;
default_logger.log("this is a sample message");

Logger logger{CapitalizeFormatter{}};
logger.log("this is a sample message");