#include <iostream>
template <std::size_t SideCount, typename T>
class EquilateralPolygon
{
public:
explicit EquilateralPolygon(T sideLength) : sideLength(sideLength) {}
std::size_t GetSideCount() const { return SideCount; }
T GetSideLength() const { return sideLength; }
T calculatePerimeter() const { return SideCount * sideLength; }
private:
T sideLength;
};
template <std::size_t SideCount, typename T>
void displayPerimeter(const EquilateralPolygon<SideCount, T>& p) {
std::cout << "perimeter length: " << p.calculatePerimeter() << std::endl;
}
using EquilateralTriangle = EquilateralPolygon<3, std::size_t>;
using Square = EquilateralPolygon<4, std::size_t>;
int main() {
Square s(5);
std::cout << "number of sides a square has: " << s.GetSideCount() << std::endl;
EquilateralTriangle t(5);
std::cout << "number of sides a triangle has: " << t.GetSideCount() << std::endl;
displayPerimeter(s);
displayPerimeter(t);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHN0ZDo6c2l6ZV90IFNpZGVDb3VudCwgdHlwZW5hbWUgVD4KY2xhc3MgRXF1aWxhdGVyYWxQb2x5Z29uCnsKcHVibGljOgogICAgZXhwbGljaXQgRXF1aWxhdGVyYWxQb2x5Z29uKFQgc2lkZUxlbmd0aCkgOiBzaWRlTGVuZ3RoKHNpZGVMZW5ndGgpIHt9CiAgICBzdGQ6OnNpemVfdCBHZXRTaWRlQ291bnQoKSBjb25zdCB7IHJldHVybiBTaWRlQ291bnQ7IH0KICAgIFQgR2V0U2lkZUxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIHNpZGVMZW5ndGg7IH0KCiAgICBUIGNhbGN1bGF0ZVBlcmltZXRlcigpIGNvbnN0IHsgcmV0dXJuIFNpZGVDb3VudCAqIHNpZGVMZW5ndGg7IH0KcHJpdmF0ZToKICAgIFQgc2lkZUxlbmd0aDsKfTsKCnRlbXBsYXRlIDxzdGQ6OnNpemVfdCBTaWRlQ291bnQsIHR5cGVuYW1lIFQ+CnZvaWQgZGlzcGxheVBlcmltZXRlcihjb25zdCBFcXVpbGF0ZXJhbFBvbHlnb248U2lkZUNvdW50LCBUPiYgcCkgewogICAgc3RkOjpjb3V0IDw8ICJwZXJpbWV0ZXIgbGVuZ3RoOiAiIDw8IHAuY2FsY3VsYXRlUGVyaW1ldGVyKCkgPDwgc3RkOjplbmRsOwp9Cgp1c2luZyBFcXVpbGF0ZXJhbFRyaWFuZ2xlID0gRXF1aWxhdGVyYWxQb2x5Z29uPDMsIHN0ZDo6c2l6ZV90PjsKdXNpbmcgU3F1YXJlID0gRXF1aWxhdGVyYWxQb2x5Z29uPDQsIHN0ZDo6c2l6ZV90PjsKCgppbnQgbWFpbigpIHsKCVNxdWFyZSBzKDUpOwoJc3RkOjpjb3V0IDw8ICJudW1iZXIgb2Ygc2lkZXMgYSBzcXVhcmUgaGFzOiAiIDw8IHMuR2V0U2lkZUNvdW50KCkgPDwgc3RkOjplbmRsOwoJCglFcXVpbGF0ZXJhbFRyaWFuZ2xlIHQoNSk7CglzdGQ6OmNvdXQgPDwgIm51bWJlciBvZiBzaWRlcyBhIHRyaWFuZ2xlIGhhczogIiA8PCB0LkdldFNpZGVDb3VudCgpIDw8IHN0ZDo6ZW5kbDsKCQoJZGlzcGxheVBlcmltZXRlcihzKTsKCWRpc3BsYXlQZXJpbWV0ZXIodCk7Cn0K