یک تابع قالبی در C++ بنویسید که مقدار شناور (مثلاً float/double) خوانده شده از یک سنسور را به نوع خروجی دلخواه تبدیل کند اما فقط در صورتی که نوع خروجی یک نوع صحیح (integral) باشد و در غیر این صورت با پیغام خطای زمانکامپایل مواجه شود، و همچنین در زمان اجرا در صورت خارج از بازهٔ نوع خروجی یک استثنای مناسب پرتاب کند؟
1.0 بازدید آخرین ویرایش در 221 روز قبل ساعت 01:27 0.0
برای این مسئله از هدر استفاده کنید و با static_assert یا std::enable_if اطمینان حاصل کنید که نوع قالبی خروجی از خانوادهٔ integral است (مثلاً std::is_integral). برای تبدیل مقدار شناور از تبدیل ایمن (static_cast) بهره ببرید و قبل از تبدیل با std::numeric_limits::min/max بازه را بررسی کنید و در صورت خارج بودن مقدار، یک استثنای استاندارد مانند std::overflow_error پرتاب کنید. این برنامه را با کامپایلرهای C++11 یا جدیدتر تست کنید؛ نکتهٔ عملی: در سیستمهای نهفته معمولاً از استثناها پرهیز میشود، پس میتوانید بهعنوان جایگزین از مقدار خطا یا std::optional استفاده کنید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
برای اطمینان از اینکه خروجی قالبی تنها از نوع integral است، از static_assert یا std::enable_if استفاده کن تا امضای تابع تنها برای std::is_integral<Output>::value فعال باشد. مقدار شناور را با static_cast به خروجی تبدیل کن و قبل از تبدیل بازهٔ خروجی را با std::numeric_limits<Output>::min()/max() چک کن. اگر مقدار ورودی خارج از بازه بود، با پرتاب std::overflow_error خطا بده؛ در سیستمهای نهفته که استثناها مناسب نیستند میتوان از std::optional یا مقدار بازگردانی خطای صریح استفاده کرد. این رویکرد با C++11 یا جدیدتر کار میکند.
گزارش