c - কিভাবে আপনি সি একটি পরামিতি হিসাবে একটি ফাংশন পাস করবেন?



function pointers (4)

আমি একটি ফাংশন তৈরি করতে চাই যা ডাটা সেটের পরামিতি দ্বারা প্রেরিত একটি ফাংশন সম্পাদন করে। কিভাবে আপনি সি একটি পরামিতি হিসাবে একটি ফাংশন পাস করবেন?


Answer #1

6.7.6.3 পি 8 অনুযায়ী ফাংশন পয়েন্টার হিসাবে "পাস" করা যেতে পারে: " ফাংশন রিটার্নিং টাইপ" হিসাবে একটি প্যারামিটার ঘোষণা "'ফিরতি টাইপ ফাংশন করার জন্য পয়েন্টার' এ সামঞ্জস্য করা হবে, যেমন 6.3.2.1 "। উদাহরণস্বরূপ, এই:

void foo(int bar(int, int));

এই সমতুল্য:

void foo(int (*bar)(int, int));

Answer #2

আপনি একটি ফাংশন পয়েন্টার পাস করতে হবে। সিনট্যাক্স একটু কষ্টকর, তবে এটির সাথে পরিচিত হওয়ার পরে এটি সত্যিই শক্তিশালী।


Answer #3

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

typedef void (*functiontype)();

অকার্যকর ফেরত একটি ফাংশন ঘোষণা করে এবং কোন আর্গুমেন্ট লাগে। এই ধরনের একটি ফাংশন পয়েন্টার তৈরি করতে আপনি এখন করতে পারেন:

void dosomething() { }

functiontype func = &dosomething;
func();

একটি ফন্ট যে একটি int ফিরে এবং একটি গৃহস্থালি লাগে জন্য আপনি করতে হবে

typedef int (*functiontype2)(char);

এবং এটি ব্যবহার করতে

int dosomethingwithchar(char a) { return 1; }

functiontype2 func2 = &dosomethingwithchar
int result = func2('a');

চমৎকার পাঠযোগ্য ধরনের ফাংশন পয়েন্টার বাঁক সঙ্গে সাহায্য করতে পারেন যে লাইব্রেরি আছে। বুস্ট ফাংশন লাইব্রেরি মহান এবং প্রচেষ্টা ভাল মূল্য!

boost::function<int (char a)> functiontype2;

উপরে চেয়ে অনেক nicer হয়।


Answer #4

যেহেতু C ++ 11 থেকে আপনি কার্যকরী লাইব্রেরিটি এটি একটি সংক্ষিপ্ত এবং জেনেরিক ফ্যাশনতে ব্যবহার করতে পারেন। সিনট্যাক্স, উদাহরণস্বরূপ,

std::function<bool (int)>

যেখানে bool একটি এক-যুক্তি ফাংশনের এখানে রিটার্ন টাইপ যার প্রথম যুক্তি টাইপ int

আমি নীচে একটি উদাহরণ প্রোগ্রাম অন্তর্ভুক্ত করেছেন:

// g++ test.cpp --std=c++11
#include <functional>

double Combiner(double a, double b, std::function<double (double,double)> func){
  return func(a,b);
}

double Add(double a, double b){
  return a+b;
}

double Mult(double a, double b){
  return a*b;
}

int main(){
  Combiner(12,13,Add);
  Combiner(12,13,Mult);
}

কখনও কখনও, যদিও, এটি একটি টেমপ্লেট ফাংশন ব্যবহার করা আরও সুবিধাজনক:

// g++ test.cpp --std=c++11

template<class T>
double Combiner(double a, double b, T func){
  return func(a,b);
}

double Add(double a, double b){
  return a+b;
}

double Mult(double a, double b){
  return a*b;
}

int main(){
  Combiner(12,13,Add);
  Combiner(12,13,Mult);
}




parameters