std::tuple یک محفظه‌ی با اندازه‌ی ثابت از مقادیر ناهمگن (Heterogeneous) است که در واقع تعمیم‌یافته‌ی std::pair محسوب می‌شود . این نوع داده، امکان ذخیره‌سازی مجموعه‌ای از اشیاء با تایپ‌های متفاوت را در یک ساختار واحد فراهم می‌کند که در برنامه‌نویسی عمومی و متاپrogramming کاربرد گسترده‌ای دارد . C++17 با افزودن قابلیت‌های جدید، کار با Tuple را ساده‌تر و قدرتمندتر از همیشه کرده است.

گام بزرگ: قواعد کسر آرگومان‌های قالبی (Class Template Argument Deduction)

قبل از C++17، برای ساخت یک شیء tuple، برنامه‌نویس یا باید به‌صورت صریح تایپ‌ها را مشخص می‌کرد یا از تابع کمکی std::make_tuple استفاده می‌نمود . C++17 با معرفی قواعد کسر آرگومان‌های قالبی (CTAD)، این فرآیند را به‌طور چشمگیری ساده‌تر کرد. اکنون کامپایلر می‌تواند تایپ‌های اعضای tuple را به‌صورت خودکار از روی آرگومان‌های ارسال‌شده به سازنده، تشخیص دهد .

با این قابلیت، کدنویسی به‌مراتب روان‌تر شده است. برای نمونه، در نسخه‌های قبل، مجبور بودیم با std::tuple<int, double> t(1, 2.3); یا std::make_tuple(1, 2.3) کار کنیم، اما در C++17 به‌سادگی می‌توان std::tuple t(1, 2.3); را نوشت . همچنین، در توابعی که یک tuple را به‌عنوان خروجی برمی‌گردانند، نیازی به استفاده از std::make_tuple نیست و می‌توان از لیست‌های مقداردهیِ کپی (Copy-list-initialization) استفاده کرد و کد را خواناتر ساخت .

پیوند ساختاریافته (Structured Bindings): گامی به سوی سادگی

پیش از C++17، برای استخراج عناصر یک tuple و انتساب آنها به متغیرهای جداگانه، از std::tie استفاده می‌شد که نیازمند تعریف قبلی متغیرها بود . با معرفی پیوند ساختاریافته در C++17، این فرآیند به سطحی جدید از سادگی و بیانگری ارتقا یافته است .

با استفاده از این قابلیت، می‌توان نتیجه‌ی یک تابع که tuple برمی‌گرداند را مستقیماً به متغیرهای جدید با تایپ‌های مشخص تفکیک کرد: auto [a, b] = return_two_args(); . همچنین این قابلیت برای std::array، ساختمان‌های ساده و حتی می‌تواند برای کلاس‌های سفارشی نیز تعریف شود . این ویژگی، وضوح کد را افزایش داده و آن را بسیار شبیه به زبان‌های مدرن‌تر می‌سازد.

توابع کمکی جدید: std::apply و std::make_from_tuple

C++17 دو تابع کمکی قدرتمند را به خانواده‌ی tuple اضافه کرده است که انعطاف‌پذیری آن را دوچندان می‌کنند .

std::apply: فراخوانی با آرگومان‌های بسته‌بندی‌شده

این تابع، پل ارتباطی بین دنیای tupleها و دنیای توابع است. std::apply یک شیء قابل‌فراخوانی (مانند یک تابع یا lambda) و یک tuple از آرگومان‌ها را دریافت کرده و آن تابع را با عناصر موجود در tuple به‌عنوان آرگومان‌های مجزا فراخوانی می‌کند . این ابزار در کدنویسی عمومی، زمانی که مجموعه‌ای از آرگومان‌ها در قالب یک تاپل ذخیره شده‌اند، بسیار ارزشمند است.

std::make_from_tuple: ساخت اشیاء از روی تاپل

اگر std::apply برای فراخوانی توابع طراحی شده، std::make_from_tuple برای ساختن یک شیء از یک tuple به کار می‌رود . این تابع یک شیء از تایپ مورد نظر را با استفاده از عناصر درون tuple به‌عنوان آرگومان‌های سازنده‌ی آن، می‌سازد . قابل ذکر است که این تابع از هر نوع شبه‌تاپلی مانند std::pair و std::array نیز پشتیبانی می‌کند .

جمع‌بندی و چشم‌انداز

C++17 با سه قابلیت کلیدی یعنی قواعد کسر آرگومان‌های قالبی برای ساده‌سازی ساخت tuple، پیوند ساختاریافته برای دسترسی آسان‌تر به عناصر، و توابع کمکی std::apply و std::make_from_tuple برای تعامل بهتر با بقیه‌ی زبان، استفاده از tuple را به تجربه‌ای لذت‌بخش‌تر و کارآمدتر تبدیل کرده است. این پیشرفت‌ها، جایگاه tuple را به‌عنوان یکی از ابزارهای کلیدی در جعبه‌ابزار برنامه‌نویسان مدرن C++ تثبیت کرده است.

کلیدواژه ها : std::tuple-C++17 tuple features-structured bindings C++17-استخراج اعضای tuple-کسر آرگومان‌های قالبی در C++17-std::apply-std::make_from_tuple-مزایای structured bindings-ساخت tuple بدون make_tuple-پیوند ساختاریافته در C++17-فراخوانی تابع با tuple-ساخت شیء از روی tuple-C++17 structured binding-آموزش tuple در C++17-کاربردهای std::apply-مقایسه std::tie و structured binding-بهبودهای tuple در C+