На Meeting C++ 2019 Джон Калб рассказал о методах шаблонов и упомянул классы политик. См. здесь источник: https://youtu.be/MLV4IVc4SwI?t=1815
Интересный фрагмент кода, о котором идет речь:
template<class T, class CheckingPolicy>
struct MyContainer : private CheckingPolicy
{
...
}
Я довольно часто видел этот тип дизайна, и мне было интересно, имеет ли здесь наследование какие-либо реальные преимущества перед композицией. По своему личному опыту я много слышал о парадигме Предпочитайте композицию наследованию. Таким образом, я бы написал код примерно так:
template<class T, class CheckingPolicy>
struct MyContainer
{
CheckingPolicy policy;
...
}
Не было бы никаких виртуальных функций. Тем не менее, я был бы признателен, если бы вы могли поделиться некоторыми мыслями о том, чем они отличаются. Я был бы особенно заинтересован в различиях в расположении памяти и его последствиях. Будет ли иметь значение, если CheckingPolicy
не будет иметь данных-членов, а будет только метод check
или перегруженный оператор вызова?