یک تابع قالبی در 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 استفاده کنید.

توسط پژوهشگر در 221 روز قبل ساعت 01:27
دسته بندی ها: C Plus Plus C Plus Plus for beginner
sara در 221 روز قبل ساعت 13:12

برای اطمینان از اینکه خروجی قالبی تنها از نوع 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 یا جدیدتر کار می‌کند.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری