কিভাবে বুস্ট :: ফাংশন এবং বুস্ট :: বাঁধাই কাজ


83

আমার সমস্ত কোডে ম্যাজিক বাক্সগুলি ছড়িয়ে দেওয়া আমার পছন্দ নয় ... ফাংশন <> এর পাস করা একটিতে সম্পূর্ণ ভিন্ন পরামিতি সেট করা থাকলেও মূলত কোনও ফাংশনকে কোনও ফাংশন ম্যাপ করার অনুমতি দেওয়ার জন্য এই দুটি শ্রেণিটি ঠিক কীভাবে কাজ করে? boost::bind

এমনকি এটি বিভিন্ন কলিং কনভেনশনগুলির সাথেও কাজ করে (যেমন সদস্য পদ্ধতিগুলি __thiscallভিসির অধীনে থাকে তবে "স্বাভাবিক" ফাংশনগুলি সাধারণত __cdeclবা __stdcallতাদের সাথে সি এর সাথে সামঞ্জস্যপূর্ণ হওয়া প্রয়োজন for



4
সত্যই নয় - এই প্রশ্নটি বাইন্ড এবং ফাংশন সম্পর্কে
1800 তথ্য

হ্যাঁ এবং এইভাবে এখনও এই প্রশ্নটি ছেড়ে যায় যে কীভাবে মাইক্রাসটি ম্যাপটিকে বেঁধে রাখতে পারে: ডোজসমেটিং (স্ট্যান্ড :: স্ট্রিং স্ট্রিং, ইনট সংখ্যা) বাড়ানোর জন্য :: ফাংশন <শূন্য (ইনট)> বাইন্ডের মাধ্যমে (& মাই ক্লাস :: ডোজ কিছু, উদাহরণ, "হ্যালো" ওয়ার্ল্ড ", _1)
ফায়ার ল্যান্সার

4
20,000 পবিত্র গরু পরিদর্শন করা এটির প্রথম পৃষ্ঠায় হওয়া দরকার!
unixman83

উত্তর:


96

boost::functionoperator()ডান স্বাক্ষরযুক্ত কোনও কিছুকে প্যারামিটারের সাথে আবদ্ধ করার অনুমতি দেয় এবং আপনার বাইন্ডের ফলাফলটিকে প্যারামিটার দিয়ে ডাকা যেতে পারে int, তাই এটি আবদ্ধ হতে পারে function<void(int)>

এটি কীভাবে এটি কাজ করে (এই বিবরণটি একইভাবে প্রযোজ্য std::function):

boost::bind(&klass::member, instance, 0, _1) এর মতো একটি বস্তু ফেরত দেয়

struct unspecified_type
{
  ... some members ...
  return_type operator()(int i) const { return instance->*&klass::member(0, i);
}

যেখানে return_typeএবং intএর স্বাক্ষর থেকে অনুমান করা হয় klass::memberএবং ফাংশন পয়েন্টার এবং সীমাবদ্ধ পরামিতি আসলে বস্তুতে সঞ্চিত থাকে, তবে এটি গুরুত্বপূর্ণ নয়

এখন, boost::functionকোনও ধরণের চেকিং করবেন না: এটি কোনও টেমপ্লেট প্যারামিটারে আপনি সরবরাহ করেছেন এমন কোনও বস্তু এবং কোনও স্বাক্ষর নেবে এবং আপনার স্বাক্ষর অনুসারে কলযোগ্য এবং এমন একটি বস্তু তৈরি করবে যা সেই বস্তুকে কল করে। যদি এটি অসম্ভব, তবে এটি একটি সংকলন ত্রুটি।

boost::function আসলে এটি এর মতো একটি বিষয়:

template <class Sig>
class function
{
  function_impl<Sig>* f;
public:
  return_type operator()(argument_type arg0) const { return (*f)(arg0); }
};

যেখানে return_typeএবং argument_typeথেকে উত্তোলন করা হয় Sig, এবং fগতিতে গতিতে বরাদ্দ করা হয়। যে বন্ধন বিভিন্ন আকারের সঙ্গে সম্পূর্ণরূপে সম্পর্কহীন বস্তু করার অনুমতি দরকার boost::function

function_impl কেবল একটি বিমূর্ত শ্রেণি

template <class Sig>
class function_impl
{
public:
  virtual return_type operator()(argument_type arg0) const=0;
};

যে ক্লাসটি সমস্ত কাজ করে, সেগুলি থেকে প্রাপ্ত একটি কংক্রিট শ্রেণি boost::function। আপনার অর্পিত প্রতিটি ধরণের অবজেক্টের জন্য একটি রয়েছেboost::function

template <class Sig, class Object>
class function_impl_concrete : public function_impl<Sig>
{
  Object o
public:
  virtual return_type operator()(argument_type arg0) const=0 { return o(arg0); }
};

এর অর্থ আপনার ক্ষেত্রে, ক্রিয়াকলাপ বাড়ানোর জন্য অ্যাসাইনমেন্ট:

  1. একটি প্রকার ইনস্ট্যান্ট করে function_impl_concrete<void(int), unspecified_type>(অবশ্যই এটি সংকলন সময়)
  2. হিপে এই ধরণের একটি নতুন অবজেক্ট তৈরি করে
  3. এই বস্তুটি বুস্ট :: ফাংশনের এফ সদস্যকে বরাদ্দ করে

আপনি যখন ফাংশনটি অবজেক্টকে কল করেন তখন এটি তার প্রয়োগকারী বস্তুর ভার্চুয়াল ফাংশনকে কল করে, যা কলটি আপনার মূল ফাংশনে ডাইরেক্ট করবে।

অস্বীকৃতি: নোট করুন যে এই ব্যাখ্যায় নামগুলি ইচ্ছাকৃতভাবে তৈরি করা হয়েছে। প্রকৃত ব্যক্তি বা চরিত্রগুলির সাথে কোনও সাদৃশ্য ... আপনি এটি জানেন। উদ্দেশ্য ছিল নীতিগুলি বর্ণনা করা।


সুতরাং স্ট্রাক্ট আনসিসিফিকড টাইপ (যেমন অপারেটর কোড)) এর বিষয়বস্তুগুলি মূলত অতীত যুক্তি থেকে উত্পন্ন হয়েছে উত্সাহিত করার জন্য :: কোনও মামলার ভিত্তিতে একটি মামলায় বাঁধাই যে কোনও সংশ্লেষ এবং সংখ্যার তর্ক যুক্ত করার অনুমতি দেয়?
ফায়ার ল্যান্সার

4
না, অপারেটরগুলির টেমপ্লেট রয়েছে () যা সমস্ত আধ্যাত্মিকতা পরিচালনা করে (এবং বিভিন্ন টেম্পলেট আর্গুমেন্টগুলি সমন্বয়গুলি পরিচালনা করে)
jpalecek

শেষ কোড ব্লকে এটিতে লেখা আছে: arg0) const=0 { return...... আমি এর আগে কখনও দেখিনি। আমি একটি ফোরামে একটি অ-কার্যকারী উদাহরণ পেয়েছি যেখানে সি ++ ফ্যাকের সাথে লিঙ্কযুক্ত ফলোআপ বার্তায় বোঝানো হয়েছে যে খাঁটি ভার্চুয়াল ফাংশনটির একটি শরীরে থাকতে পারে, তবে আমি এই জাতীয় বাক্যটি (ঝনক ও জিসিসি) ব্যবহার করে সংকলনের জন্য কোনও কোড পেতে পারি না।
ব্রায়ান ভ্যান্ডেনবার্গ

আমাকে আমার প্রশ্নটি কিছুটা স্পষ্ট করে বলা উচিত: =0;পরে দেহের সাথে ঘোষিত হলে খাঁটি ভার্চুয়াল একটি দেহ দেওয়া যেতে পারে (যেমন, void Base::Blah() { /* ... */ }) ... আমি উপরে উল্লিখিত স্বরলিপি সম্পর্কে বিশেষভাবে জিজ্ঞাসা করছি; আমি অনুমান করছি এটি কেবল একটি টাইপো।
ব্রায়ান ভ্যান্ডেনবার্গ

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