এন স্ট্রিম হিসাবে এনাম টাইপের ভেরিয়েবল ব্যবহার করার সহজ উপায়?


89

আমি যা করার চেষ্টা করছি তা এখানে:

আমি এমন একটি ফাংশন লেখার চেষ্টা করছি যা নিম্নলিখিতগুলির মতো একটি স্যুইচ কেস করতে পারে:

প্রতিটি ক্ষেত্রে সংজ্ঞায়িত করার পরিবর্তে, এনাম ভেরিয়েবলটি ব্যবহার করে এটি সেট করার কোনও উপায় কি আমি উপরে করার চেষ্টা করছি?

উত্তর:


16

কোনও অন্তর্নির্মিত সমাধান নেই। সবচেয়ে সহজ উপায় হ'ল এমন একটি অ্যারের সাথে char*যেখানে এনামের বর্ণনামূলক নাম সম্বলিত স্ট্রিংয়ে এনামের ইনট মান সূচক হয়। আপনার যদি একটি স্পারস থাকে enum(এমন একটি যা 0 থেকে শুরু হয় না বা সংখ্যায় ফাঁক রয়েছে) যেখানে কিছু intম্যাপিং যথেষ্ট পরিমাণে অ্যারে-ভিত্তিক ম্যাপিংকে অবৈধ করে তুলতে পারে তার পরিবর্তে আপনি হ্যাশ টেবিলটি ব্যবহার করতে পারেন।


এটি প্রসারিত করে বলা যায়, যদি সত্যিই এটি একটি রৈখিকভাবে বাড়ানো তালিকা হয় তবে আপনি প্রতিটি সম্পাদকের ম্যাক্রো সরঞ্জামটি প্রতিটি স্ট্রিংয়ের সাথে রেকর্ড করতে এবং সমাধান করতে পারেন। সামান্য অতিরিক্ত টাইপিংয়ের প্রয়োজন এবং আপনি প্রথম স্থানে সংজ্ঞায়নের প্রয়োজনীয়তা বাদ দেন। আমি অনুলিপি করা ম্যাক্রোগুলির শেষের রেকর্ডে ক্লিক করি, পরে একটি উক্তি যুক্ত করে পরবর্তী লাইনে একই জায়গায় এগিয়ে যাই। আমি থামি ধাক্কা। আমি এক্স রান টিপুন এবং অনেকগুলি আছে (বা কেবলমাত্র একক পদক্ষেপ) do আমি তারপরে এটিকে একটি স্ট্রিং অ্যারেতে গুটিয়ে রাখতে পারি।
ব্যবহারকারী 2262111

70

সি সনাক্তকারী এবং একটি স্ট্রিং উভয়ই কিছু তৈরির কৌশল ? এখানে ব্যবহার করা যেতে পারে।

এই জাতীয় প্রিপ্রোসেসর স্টাফ হিসাবে যথারীতি, প্রিপ্রোসেসর অংশটি লেখা এবং বোঝা কঠিন হতে পারে এবং এর মধ্যে অন্য ম্যাক্রোগুলিতে ম্যাক্রোগুলি পাস করা অন্তর্ভুক্ত এবং # এবং ## অপারেটর ব্যবহার করে জড়িত তবে এটি ব্যবহার করা সত্যই সহজ is আমি দীর্ঘ শৈলীর জন্য এই স্টাইলটি খুব দরকারী বলে মনে করি, যেখানে একই তালিকা দু'বার বজায় রাখা সত্যিই ঝামেলা হতে পারে।

কারখানার কোড - কেবল একবার টাইপ করা হয়, সাধারণত শিরোনামে লুকানো থাকে:

এনামফ্যাক্টরি।

কারখানা ব্যবহৃত

someEnum.h:

someEnum.cpp:

কৌশলটি সহজেই প্রসারিত করা যায় যাতে XX ম্যাক্রো আরও আর্গুমেন্ট গ্রহণ করে এবং আপনি এই নমুনাটিতে যে তিনটি সরবরাহ করেছেন তার অনুরূপ বিভিন্ন প্রয়োজনের জন্য XX এর বিকল্পের জন্য আরও ম্যাক্রো প্রস্তুত করতে পারেন।

# অন্তর্ভুক্ত / # ডেফাইন / #undef ব্যবহার করে এক্স-ম্যাক্রোসের সাথে তুলনা করুন

এটি অন্যদের উল্লিখিত এক্স-ম্যাক্রোসের অনুরূপ হলেও, আমি মনে করি যে এই সমাধানটি আরও মার্জিত বলে মনে হয় যে এটিতে # কোনও পরিমাণের প্রয়োজন হয় না, যা আপনাকে আরও জটিল জিনিসগুলি লুকানোর অনুমতি দেয় কারখানায় শিরোলেখ ফাইল - শিরোনাম ফাইল একটি নতুন এনাম সংজ্ঞায়িত করার সময় যখন আপনি একেবারেই স্পর্শ করছেন না এমন কিছু এটি তাই নতুন এনাম সংজ্ঞাটি অনেক খাটো এবং ক্লিনার।


4
আমি নিশ্চিত না আপনি কীভাবে এটি বলতে পারবেন এটি এক্স-ম্যাক্রোগুলের চেয়ে ভাল / খারাপ - এটি এক্স-ম্যাক্রো। এটি SOME_ENUM(XX)হ'ল একটি এক্স-ম্যাক্রো (সুনির্দিষ্টভাবে বলতে গেলে, "ব্যবহারকারীর ফর্ম" যা XXব্যবহার না করে ফাংশনটি পাস করে #def #undef) এবং তারপরে পুরো এক্স-ম্যাক্রোটি তারপরে ডিফিনE_ENUM এ যায় যা এটি ব্যবহার করে। সমাধান থেকে কিছু দূরে না নেওয়া - এটি ভাল কাজ করে। এটি পরিষ্কার করতে যে এটি এক্স ম্যাক্রোগুলির ব্যবহার।
BeeOnRope

4
@ বিওনরপ আপনি যে পার্থক্যটি লক্ষ্য করেছেন তা তাৎপর্যপূর্ণ, এবং এই সমাধানটিকে আইডিয়োমেটিক এক্স ম্যাক্রো (যেমন উইকিপিডিয়ায় উদাহরণস্বরূপ ) থেকে পৃথক করে। XXপুনর্বিবেচনা অতিক্রম করার সুবিধাটি #defineহ'ল পূর্ববর্তী প্যাটার্নটি ম্যাক্রো বিস্তারে ব্যবহার করা যেতে পারে। লক্ষ্য করুন যে এই হিসাবে সংক্ষিপ্ত হিসাবে কেবলমাত্র অন্যান্য সমাধানগুলিই একটি নতুন এনাম সংজ্ঞায়িত করতে আলাদা ফাইল তৈরি এবং একাধিক-অন্তর্ভুক্তির প্রয়োজন itate
পিএমটিভরা

4
আরেকটি কৌশল হ'ল এনাম নামটি ম্যাক্রো নাম হিসাবে ব্যবহার করা । আপনি সহজেই লিখতে পারেন #define DEFINE_ENUM(EnumType) ..., এর সাথে প্রতিস্থাপন ENUM_DEF(...)করতে EnumType(...)পারেন এবং ব্যবহারকারীকে বলতে পারেন #define SomeEnum(XX) ...। সি প্রিপ্রোসেসর প্রসঙ্গত SomeEnumম্যাক্রো অনুরোধে প্রসারিত হবে যখন বন্ধনীগুলি অনুসরণ করবে এবং অন্যথায় একটি নিয়মিত টোকনে পরিণত হবে। (অবশ্যই, এই সমস্যার ব্যবহারকারী ব্যবহার করতে লেগেছে যদি ঘটায় SomeEnum(2)বদলে enum টাইপ কাস্ট করতে (SomeEnum)2বা static_cast<SomeEnum>(2)।)
pmttavara

4
@ পিপিটিভরা - নিশ্চিত, যদি দ্রুত অনুসন্ধান করা হয় তবে এক্স-ম্যাক্রোসের সর্বাধিক সাধারণ ব্যবহার যদি একটি নির্দিষ্ট অভ্যন্তরীণ-ম্যাক্রো নাম #defineএবং পাশাপাশি ব্যবহার করে #undef। "ব্যবহারকারী ফর্ম" (উদাহরণস্বরূপ, নিবন্ধের নীচে প্রস্তাবিত ) এক ধরণের এক্স-ম্যাক্রো থাকা সত্ত্বেও আপনি কি একমত নন ? আমি অবশ্যই এটিকে সর্বদা এক্স-ম্যাক্রো বলেছি এবং সি কোডবাসে আমি ইদানীং এসেছি এটি সর্বাধিক সাধারণ রূপ (এটি অবশ্যই একটি পক্ষপাতদুষ্ট পর্যবেক্ষণ)। আমি যদিও ওপিটিকে ভুলভাবে পার্স করছিলাম।
BeeOnRope

4
@ বিঅনরোপ বর্তমান শব্দবন্ধটি সম্পাদনার ফলাফল, আপনি যেমন আমাকে ফিরে নিশ্চিত করেছিলেন তবে এটি এক্স-ম্যাক্রো, এমনকি যদি এটি সম্ভবত কম ব্যবহৃত ফর্ম (বা কমপক্ষে নিবন্ধগুলির মধ্যে একটি কম উল্লেখ করা হয়েছিল) তখনও ছিল।
সুমা

62

4
এটি সিপিপি তৈরির জন্য তৈরি জিনিস ছিল। +1
ডেরিক টার্ক

6
এটি একটি ভাল উত্তর, এটি বিশেষ সরঞ্জামগুলি ব্যবহার না করে সবচেয়ে ভাল যেটি করতে পারে তা সম্পর্কে মনে হয় এবং আমি আগে এই ধরণের কাজটি করেছি; তবে এটি এখনও কখনও সত্য বলে মনে হয় না এবং এটি করা সত্যই আমার কখনও পছন্দ হয় না ...
মাইকেল

ছোট পরিবর্তন: #define ENUM_END(typ) }; extern const char * typ ## _name_table[];মধ্যে defs.hফাইল - এই ফাইল আপনি এটি ব্যবহার আপনার নাম টেবিল জানাবেন। (যদিও টেবিলের আকারটি ঘোষণার কোনও ভাল উপায় বের করতে পারি না)) এছাড়াও, ব্যক্তিগতভাবে আমি চূড়ান্ত সেমিকোলনটি ছেড়ে চলে যাই, তবে যোগ্যতাগুলি কোনওভাবেই বিতর্কযোগ্য।
ক্রিস লুটজ

4
@ বিল, typলাইনে বিরক্ত কেন #define ENUM_END(typ) };?
পেসারিয়ার

আমি যেখানে আমার ম্যাক্রোটিকে "ONE = 5" হিসাবে সংজ্ঞায়িত করতে চাই সেখানে এটি কাজ করে না
UKMonkey

13

এটি করার অবশ্যই একটি উপায় রয়েছে - এক্স () ম্যাক্রোগুলি ব্যবহার করুন । এই ম্যাক্রোগুলি সোর্স ডেটার একটি তালিকা থেকে এনাম, অ্যারে এবং কোড ব্লক তৈরিতে সি প্রিপ্রসেসর ব্যবহার করে। আপনাকে কেবল এক্স () ম্যাক্রোযুক্ত # ডিফাইনটিতে নতুন আইটেম যুক্ত করতে হবে। স্যুইচ বিবৃতি স্বয়ংক্রিয়ভাবে প্রসারিত হবে।

আপনার উদাহরণটি নিম্নরূপ লেখা যেতে পারে:

আরও কার্যকর উপায় আছে (যেমন স্ট্রিং অ্যারে এবং এনাম সূচক তৈরি করতে এক্স ম্যাক্রো ব্যবহার করে) তবে এটি সহজতম ডেমো।


8

আমি জানি আপনার কাছে বেশ কয়েকটি শক্ত উত্তর রয়েছে তবে আপনি কি সি প্রিপ্রসেসরে # অপারেটর সম্পর্কে জানেন?

এটি আপনাকে এটি করতে দেয়:



6

সি বা সি ++ এই কার্যকারিতাটি সরবরাহ করে না, যদিও আমার প্রায়শই এটি প্রয়োজন হয়।

নিম্নলিখিত কোডটি কাজ করে, যদিও এটি অবিচ্ছিন্ন এনামগুলির পক্ষে সেরা suited

অপ্রয়োজনীয় দ্বারা, আমি ফর্মের নয়

যেহেতু এটির মধ্যে বিশাল ব্যবধান রয়েছে।

এই পদ্ধতির সুবিধাটি হ'ল এটি এনামগুলি এবং স্ট্রিংগুলির সংজ্ঞাগুলি একে অপরের কাছে রাখে; একটি ফাংশনে একটি স্যুইচ স্টেটমেন্ট থাকার তাদের spearates। এর অর্থ আপনি অন্যটি বাদ দিয়ে একটি পরিবর্তন করার সম্ভাবনা কম।


6

KISS। আপনি আপনার এনামগুলিতে সমস্ত ধরণের অন্যান্য স্যুইচ / কেস জিনিসগুলি করছেন তাই কেন মুদ্রণ আলাদা করা উচিত? আপনার মুদ্রণ রুটিনে কেসটি ভুলে যাওয়া কোনও বিশাল বিষয় নয় যখন আপনি বিবেচনা করেন যে প্রায় 100 টির মতো জায়গা রয়েছে যেখানে আপনি কেসটি ভুলে যেতে পারেন। শুধু সংকলন-ওয়াল, যা অ-বিস্তৃত কেস ম্যাচের বিষয়ে সতর্ক করবে। "ডিফল্ট" ব্যবহার করবেন না কারণ এটি স্যুইচটি সম্পূর্ণরূপে তৈরি করবে এবং আপনি সতর্কতা পাবেন না। পরিবর্তে, স্যুইচটি প্রস্থান করতে দিন এবং এর মতো ডিফল্ট কেসটি মোকাবেলা করুন ...



4

এর ব্যবহার বুস্ট :: প্রিপ্রোসেসর নীচের মত একটি মার্জিত সমাধান সম্ভব করে তোলে:

পদক্ষেপ 1: শিরোলেখ ফাইলটি অন্তর্ভুক্ত করুন:

পদক্ষেপ 2: নিম্নলিখিত সিনট্যাক্সের সাথে গণনা অবজেক্টটি ঘোষণা করুন:

পদক্ষেপ 3: আপনার ডেটা ব্যবহার করুন:

উপাদানের সংখ্যা পাওয়া:

সম্পর্কিত স্ট্রিং পাওয়া:

সম্পর্কিত স্ট্রিং থেকে এনাম মান পাওয়া:

এতে কোনও অতিরিক্ত ফাইল অন্তর্ভুক্ত না করে এটি পরিষ্কার এবং কমপ্যাক্ট দেখাচ্ছে। এনাম ইউটিলিটিস-এর মধ্যে আমি যে কোডটি লিখেছি তা নিম্নলিখিত:

কিছু সীমাবদ্ধতা রয়েছে, যেমন উত্সাহিত :: প্রাকপ্রসেসর। এই ক্ষেত্রে, ধ্রুবকের তালিকা 64 টি উপাদানের চেয়ে বড় হতে পারে না।

একই যুক্তি অনুসরণ করে, আপনি বিরল এনাম তৈরি করতেও ভাবতে পারেন:

এই ক্ষেত্রে বাক্য গঠনটি হ'ল:

ব্যবহারটি উপরের মতোই (বিয়োগফল ই-নেম ## 2 এনিম ফাংশন, আপনি আগের বাক্য গঠন থেকে এক্সট্রোপোলেট করার চেষ্টা করতে পারেন)।

আমি এটি ম্যাক এবং লিনাক্সে পরীক্ষা করেছি, তবে সচেতন হতে হবে যে বুস্ট :: প্রিপ্রোসেসর পুরোপুরি পোর্টেবল হতে পারে না।


3

এখানে কিছু কৌশল মার্জ করে আমি সহজ ফর্মটি নিয়ে এসেছি:


2

আপনি যদি জিসিসি ব্যবহার করেন তবে এটি ব্যবহার করা সম্ভব:

তারপরে কেবল উদাহরণস্বরূপ কল করুন


1

মু ডায়নামিক্স গবেষণা ল্যাবগুলি - ব্লগ সংরক্ষণাগার এ ধারণাগুলি দেখুন । আমি এই বছরের শুরুর দিকে এটি খুঁজে পেয়েছি - আমি যেখানে এটি এসেছিলাম তার সঠিক প্রসঙ্গটি ভুলে গিয়েছি - এবং এ কোডটিতে এটি রূপান্তরিত করেছি। আমরা সামনে ই যুক্ত করার যোগ্যতা নিয়ে বিতর্ক করতে পারি; এটি নির্দিষ্ট সমস্যার ক্ষেত্রে প্রযোজ্য, তবে কোনও সাধারণ সমাধানের অংশ নয়। আমি এটি আমার 'ভিগনেটস' ফোল্ডারে রেখেছি - যেখানে আমি পরে কোডগুলি চাইলে কোডের আকর্ষণীয় স্ক্র্যাপগুলি রাখি। আমি বিব্রত হয়ে বলতে চাই যে এই সময়ে এই ধারণাটি কোথা থেকে এসেছিল আমি কোনও নোট রাখিনি।

শিরোলেখ: paste1.h

উদাহরণ উত্স:

সি প্রাক-প্রসেসরের বিশ্বের পরিষ্কার ব্যবহারের প্রয়োজন নেই - তবে এটি একাধিকবার উপাদান লেখা রোধ করে না।



0

যদি এনাম সূচকটি 0-ভিত্তিক হয় তবে আপনি নামগুলি চর * এর অ্যারে রেখে দিতে পারেন এবং এনাম মান দিয়ে সূচক করতে পারেন।



0

আমি একটি সহজ টেমপ্লেট করা বর্গ তৈরি করেছেন streamable_enumযে ব্যবহারসমূহ অপারেটার স্ট্রিম <<এবং >>এবং উপর ভিত্তি করে তৈরি std::map<Enum, std::string>:

ব্যবহার:


0

নিম্নলিখিত বৈশিষ্ট্য সহ ম্যাক্রো ব্যবহার করে এখানে একটি সমাধান দেওয়া হয়েছে:

  1. কেবল এনামের প্রতিটি মান একবার লিখুন, যাতে বজায় রাখার জন্য কোনও ডাবল তালিকা নেই

  2. এনাম মানগুলি একটি পৃথক ফাইলে রাখবেন না যা পরে # অন্তর্ভুক্ত রয়েছে, তাই আমি যেখানে চাই সেখানে এটি লিখতে পারি

  3. এনামকে নিজেই প্রতিস্থাপন করবেন না, আমি এখনও এনাম টাইপটি সংজ্ঞায়িত করতে চাই, তবে এটির পাশাপাশি আমি প্রতিটি এনামের নামটিকে সংশ্লিষ্ট স্ট্রিংয়ে মানচিত্র তৈরি করতে সক্ষম করতে চাই (লিগ্যাসি কোডটি প্রভাবিত না করে)

  4. অনুসন্ধানগুলি দ্রুত হওয়া উচিত, সুতরাং সেই বিশাল এনামগুলির জন্য পছন্দমতো কোনও স্যুইচ-কেস নেই

https://stackoverflow.com/a/20134475/1812866


0

আমি ভেবেছিলাম যে বুস্ট.ফিউশন এর মত একটি সমাধান স্ট্রাক্ট এবং ক্লাসগুলি মানিয়ে নেওয়ার জন্য একটি দুর্দান্ত হবে, তাদের এমনকি কিছুটা সময় ছিল, একটি ফিউশন ক্রম হিসাবে এনামগুলি ব্যবহার করার জন্য।

সুতরাং আমি এনামগুলিকে মুদ্রণের জন্য কোড তৈরি করতে কিছু ছোট ম্যাক্রো তৈরি করেছি। এটি নিখুঁত নয় এবং বুস্টের সাথে দেখার মতো কিছুই নেই usionফিউশন উত্পন্ন বয়লারপ্লেট কোডটি দিয়ে তবে এটি বুস্ট ফিউশন ম্যাক্রোগুলির মতো ব্যবহার করা যেতে পারে। আমি বুস্ট-ফিউশন দ্বারা প্রয়োজনীয় কাঠামোগত জেনারেট করতে চাই যা এই অবকাঠামোতে সংহত করার জন্য যা কাঠামোর সদস্যদের নাম মুদ্রণের অনুমতি দেয়, তবে এটি পরে ঘটবে, আপাতত এটি কেবল ম্যাক্রোস:

#ifndef SWISSARMYKNIFE_ENUMS_ADAPT_ENUM_HPP
#define SWISSARMYKNIFE_ENUMS_ADAPT_ENUM_HPP

#include <swissarmyknife/detail/config.hpp>

#include <string>
#include <ostream>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/stringize.hpp>
#include <boost/preprocessor/seq/for_each.hpp>


#define SWISSARMYKNIFE_ADAPT_ENUM_EACH_ENUMERATION_ENTRY_C(                     \
    R, unused, ENUMERATION_ENTRY)                                               \
    case ENUMERATION_ENTRY:                                                     \
      return BOOST_PP_STRINGIZE(ENUMERATION_ENTRY);                             \
    break;                                                                      

/**
 * \brief Adapts ENUM to reflectable types.
 *
 * \param ENUM_TYPE To be adapted
 * \param ENUMERATION_SEQ Sequence of enum states
 */
#define SWISSARMYKNIFE_ADAPT_ENUM(ENUM_TYPE, ENUMERATION_SEQ)                   \
    inline std::string to_string(const ENUM_TYPE& enum_value) {                 \
      switch (enum_value) {                                                     \
      BOOST_PP_SEQ_FOR_EACH(                                                    \
          SWISSARMYKNIFE_ADAPT_ENUM_EACH_ENUMERATION_ENTRY_C,                   \
          unused, ENUMERATION_SEQ)                                              \
        default:                                                                \
          return BOOST_PP_STRINGIZE(ENUM_TYPE);                                 \
      }                                                                         \
    }                                                                           \
                                                                                \
    inline std::ostream& operator<<(std::ostream& os, const ENUM_TYPE& value) { \
      os << to_string(value);                                                   \
      return os;                                                                \
    }

#endif

নীচের পুরানো উত্তরটি বেশ খারাপ, দয়া করে এটি ব্যবহার করবেন না। :)

পুরানো উত্তর:

আমি এমন একটি উপায় অনুসন্ধান করেছি যা খুব বেশি এনাম ঘোষণার বাক্য গঠন পরিবর্তন না করে এই সমস্যার সমাধান করে। আমি এমন একটি সমাধান নিয়ে এসেছি যা স্ট্রিংফাইড এনাম ঘোষণার থেকে স্ট্রিং পুনরুদ্ধার করতে প্রিপ্রসেসর ব্যবহার করে।

আমি অবিচ্ছিন্ন এনামগুলিকে এর মতো সংজ্ঞা দিতে সক্ষম:

এবং আমি তাদের সাথে বিভিন্ন উপায়ে যোগাযোগ করতে পারি:

নিম্নলিখিত সংজ্ঞা উপর ভিত্তি করে:

যখন স্পার্স এনামের জন্য আমার সমর্থন প্রয়োজন এবং যখন আমি আরও সময় পাব তখন আমি টু স্ট্রিং এবং বস্ট :: এক্সপ্রটিভ সহ স্ট্রিং বাস্তবায়নগুলি উন্নত করব , তবে এটি সংশোধনকারী সময়ে গুরুত্বপূর্ণ টেম্প্লেটিংয়ের কারণে ব্যয় হবে এবং নির্বাহযোগ্য কার্যকর হবে সত্যিই বড় হতে পারে। তবে এর সুবিধা রয়েছে যে এটি এই কুরুচিপূর্ণ ম্যানুয়াল স্ট্রিং ম্যানিপুলেশন কোডের চেয়ে আরও পঠনযোগ্য এবং রক্ষণাবেক্ষণযোগ্য হবে। : ডি

অন্যথায় আমি সবসময় এনামস মান এবং স্ট্রিংয়ের মধ্যে ম্যাপিংগুলি সম্পাদন করতে বুস্ট :: বিম্যাপ ব্যবহার করেছি তবে এটি ম্যানুয়ালি বজায় রাখতে হবে।


0

যেহেতু আমি সমস্ত সাধারণ কারণে ম্যাক্রো ব্যবহার না করা পছন্দ করি, তাই আমি আরও সীমিত ম্যাক্রো সমাধান ব্যবহার করলাম যাতে এনাম ডিক্লেয়ারেশন ম্যাক্রো মুক্ত রাখার সুবিধা রয়েছে। অসুবিধাগুলির মধ্যে প্রতিটি এনামের জন্য ম্যাক্রো স্পেসিফিকেশনটি অনুলিপি করা এবং এনামগুলিতে মান যুক্ত করার সময় স্পষ্টভাবে ম্যাক্রো অনুরোধ যুক্ত করা অন্তর্ভুক্ত include

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.