بخش ۱۶ - اشاره‌گر به تابع

در این بخش اشاره‌گرهای به توابع، ردکردن آنها به صورت پارامتر و مثال‌های مرتبط مورد بررسی قرار می‌گیرند.

فهرست مثال‌ها

اشاره‌گر به تابع

در این مثال، یک اشاره‌گر به توابعی که یک int می‌گیرند و چیزی برنمی‌گردانند تعریف می‌شود.

1_FuncPtr.cpp
#include <iostream>
using namespace std;

void print(int x) {
    cout << x << endl;
}

void print_twice(int x) {
    cout << x << ' ' << x << endl;
}

int main() {
    void (*func_ptr)(int);

    func_ptr = print;
    func_ptr(10);

    func_ptr = print_twice;
    func_ptr(20);
}
				
تعریف تایپ برای اشاره‌گر به توابع

در این مثال، به تایپ اشاره‌گر به تابع توسط typedef نام داده می‌شود

2_FuncPtrTypedef.cpp
#include <iostream>
using namespace std;

typedef void (*func_ptr_type)(int);

int main() {
    func_ptr_type fp;

    fp = print;
    fp(10);
}
				
رد کردن توابع به عنوان پارامتر

در این مثال تابعی تعریف می‌شود که پارامتر آن توابع هستند.

3_FuncPtrParam.cpp
#include <iostream>
using namespace std;

typedef int (*binop)(int, int);

int f(binop op, int x, int y, int z) {
    return op(op(x, y), z);
}

int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }

int main() {
    cout << f(add, 1, 3, 5) << endl;
    cout << f(sub, 1, 3, 5) << endl;
}
				
ارزشیابی عبارت‌های خیلی ساده

در این مثال عبارت‌هایی بسار ساده که از چهارعمل اصلی و اعداد صحیح یک رقمی تشکیل شده‌اند ارزشیابی می‌شوند مثل 1+7/5*4-6. عملگرها از چپ به راست و بدون اولویت درنظر گرفته می‌شوند. تشخیص این که برای هر عملگری چه عملی انجام شود توسط یک نگاشت از کاراکتر عملگر به تابعی که مقدار آن را محاسبه می‌کند صورت می‌پذیرد.

4_ExpressionEval.cpp
#include <iostream>
#include <string>
#include <map>
using namespace std;

typedef int (*operation)(int, int);

int add(int a, int b) { return a + b; }
int mult(int a, int b) { return a * b; }
int sub(int a, int b) { return a - b; }
int divide(int a, int b) { return a / b; }

int main() {
    string s;
    cin >> s;

    map<char, operation> ops;
    ops['+'] = add;
    ops['-'] = sub;
    ops['*'] = mult;
    ops['/'] = divide;

    int result = s[0] - '0';
    for (int i = 1; i < s.length(); i += 2)
        result = ops[s[i]](result, s[i+1]-'0');

    cout << result << endl;
}