দুটি স্ট্রিং অদলবদল করার জন্য টেমপ্ল্যাটাইজড ফুকশন ব্যবহার করার চেষ্টা করছি


9
#include<iostream>
#include<string>

template <typename T>
void swap(T a , T b)
{
  T temp = a;
  a = b;
  b = temp;
}

template <typename T1>
void swap1(T1 a , T1 b)
{
  T1 temp = a;
  a = b;
  b = temp;
}

int main()
{
  int a = 10 , b = 20;
  std::string first = "hi" , last = "Bye";

  swap(a,b);
  swap(first, last);   

  std::cout<<"a = "<<a<<" b = "<<b<<std::endl;
  std::cout<<"first = "<<first<<" last = "<<last<<std::endl;    

  int c = 50 , d = 100;
  std::string name = "abc" , surname = "def";

  swap1(c,d);
  swap1(name,surname);

  std::cout<<"c = "<<c<<" d = "<<d<<std::endl;
  std::cout<<"name = "<<name<<" surname = "<<surname<<std::endl;    

  swap(c,d);
  swap(name,surname);

  std::cout<<"c = "<<c<<" d = "<<d<<std::endl;
  std::cout<<"name = "<<name<<" surname = "<<surname<<std::endl;    

  return 0;
}

**Output**
a = 10 b = 20
first = Bye last = hi
c = 50 d = 100
name = abc surname = def
c = 50 d = 100
name = def surname = abc

উভয় swap()এবং swap1()মূলত একই ফাংশন-সংজ্ঞা আছে তবে কেন কেবল swap()আসলে স্ট্রিংগুলি অদলবদল করে, যখন swap1()না?

এছাড়াও আপনি কি আমাকে বলতে পারেন যে স্ট্রাল স্ট্রিংগুলি ডিফল্টরূপে আর্গুমেন্ট হিসাবে কীভাবে পাস হয় তারা মান বা রেফারেন্স দ্বারা পাস হয়?



1
এতে কোনও ভুল নেই। আমি টেম্পলেটাইজড ফাংশন সম্পর্কে শিখছিলাম। সুতরাং আমি এই কোডটি লিখেছিলাম কেবল অনুশীলন করার জন্য তবে আউটপুট আমাকে বিভ্রান্ত করেছে o সুতরাং আমি জিজ্ঞাসা করেছি।
বেটটারপ্রোগ্রামার

উত্তর:


9

আমি দেখতে পাচ্ছি যে লোকেরা কেন এখন এডিএলকে ঘৃণা করছে ...

আপনি যা দেখছেন তা আর্গুমেন্ট নির্ভর নির্ভর চেহারা । আপনি যদি আপনার swapপ্রয়োগের ভিতরে একটি মুদ্রণ যুক্ত করেন তবে আপনি লক্ষ্য করবেন যে এটির জন্য , এটির জন্য নয়std::stringint

std::swapআপনার সংস্করণে অগ্রাধিকার দেওয়া হয়, কারণ প্রকারের জন্য একটি স্পষ্ট স্পেশালাইজেশন রয়েছে std::basic_string। যদি এটি উপস্থিত না থাকে, কল সম্ভবত অস্পষ্ট হবে।
কারণ int, অনুসন্ধানের ক্ষেত্রে নেমস্পেস stdবিবেচনা করা হয় না, সুতরাং আপনার সংস্করণটি কেবল গ্রহণযোগ্য।

এছাড়াও আপনি কি আমাকে বলতে পারেন যে স্ট্রাল স্ট্রিংগুলি ডিফল্টরূপে যুক্তি হিসাবে কীভাবে পাস হয় তারা কী মান বা রেফারেন্স দ্বারা পাস হয়?

সি ++ এর সমস্ত কিছু মান দ্বারা পাস করা হয়, যদি না আপনি এটিকে স্পষ্টভাবে পাস-বাই-রেফারেন্স হিসাবে চিহ্নিত করেন।


এই কোডটি এখানে দেখুন: পেস্টবিন . com / E257yw04 । আমার ফাংশন swap1 () স্ট্রিংয়ের জন্য বলা হয়, তবে কেবল একবার। কেন এমন?
বেটারপ্রোগ্রামার

@ ডাম্ব_প্রোগ্রামার আপনার কোডে অদলবদল করতে আপনার দুটি কল রয়েছে (একটির জন্য intএবং একটি এর জন্য std::string), এবং তাই দুটি কল মুদ্রিত হয়। সেখানে দুটি কল হয় swapসঙ্গে std::string, এবং যারা ব্যবহার std::swap(কোনো মুদ্রণ)।
ইয়াকিসারভিনেন

বুঝেছি!! তোমাকে অনেক ধন্যবাদ.
বিটারপ্রগ্রামার

@ ডাম্ব_প্রোগ্রামার সাইড নোট: দয়া করে নিজেকে বোবা বলবেন না। ইমপোস্টর সিন্ড্রোম এই কাজের মধ্যে সাধারণ, তবে প্রোগ্রামারটির আসল মান "তিনি কতটা জানেন" তা নয় বরং "তিনি কতটা শিখতে ইচ্ছুক" তা নয়। আপনি কিছু বুঝতে পারেন নি, সুতরাং আপনি পৌঁছে গিয়ে জিজ্ঞাসা করলেন - এটি করা সেরা সম্ভাব্য কর্ম (অবশ্যই প্রথমে গুগল করার পরে)।
ইয়াকিসারভিনেন

হ্যাঁ আমি প্রতিদিন ভাল হয়ে যাচ্ছি! আপনার জবাবের জন্য ধন্যবাদ
বিটারপ্রগ্রামার

0

আপনি মান অনুসারে পরামিতিগুলি পার করছেন। আপনাকে এগুলি রেফারেন্সের মাধ্যমে পাস করতে হবে:

template <typename T> void myswap(T& a , T& b);

বা - আরও সাধারণভাবে - বিশ্বব্যাপী (মূল্য) রেফারেন্স দ্বারা:

template <typename T> void myswap(T&& a , T&& b);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.