আমি সিন্টেক্স ব্যবহার করে সি ++ 11 দিয়ে কোনও ফাংশন পয়েন্টারটি কীভাবে টাইপ করব?


171

আমি এটি লিখতে চাই

typedef void (*FunctionPtr)();

ব্যবহার using। আমি যে কিভাবে করতে হবে?


2
খুব বিস্মৃত usingসত্যই, বিশেষত কারণ ফাংশন পয়েন্টার শনাক্তকারীরা সাধারণত একটি typedefবিবৃতিটির মাঝখানে থাকে এবং ব্যবহার করে সামনের দিকে চলে যায় using। অন্তত আমি যেখানে হারিয়েছি।
স্টার্ট্টল

উত্তর:


180

আপনি পয়েন্টার থেকে শনাক্তকারীটিকে অপসারণ ব্যতীত এর অনুরূপ বাক্য গঠন রয়েছে:

using FunctionPtr = void (*)();

এখানে একটি উদাহরণ

আপনি যদি "কুৎসিততা কেড়ে নিতে" চান, তবে জিওর পরামর্শ অনুসারে চেষ্টা করুন:

#include <type_traits>

using FunctionPtr = std::add_pointer<void()>::type;

এবং এখানে অন্য ডেমো


25
ডাং, আমি আশা করি এটি :(
কুৎসিততা

10
@ রুবেনভবি:; using FunctionPtr = AddPointer<void()>;)
Xoo

2
আরও পরিষ্কার করার জন্য টেমপ্লেট ধরণের এলিয়াস ব্যবহার করা সম্ভব add_pointer<void()>::type: প্রস্তাবনাটি এখানে ব্যবহার করে: groups.google.com/a/isocpp.org/d/msg/std-proposals/xDQR3y5uTZ0/… আপনি লিখতে পারেন pointer<function<void>>
bames53

5
এই প্রকারের উপাধিগুলি প্রকারের সিনট্যাক্সকে অস্পষ্ট করে, অভ্যন্তরীণ আউট বাক্যকে একটি সাধারণ বাম-থেকে-ডান সিনট্যাক্সে পরিবর্তিত করে, যা নির্দিষ্ট এপিআইয়ের জন্য কাস্টম টাইপডেফের প্রয়োজনীয়তাকে মূলত সরিয়ে দেয় যা এপিআইয়ের যৌগিক প্রকারগুলি লিখতে সহজ করে তোলে।
bames53

10
সি ++ ১৪ এ, আপনি লিখতে সক্ষম হবেন: FunctionPtr = std :: add_pointer_t <void ()> ব্যবহার করে;
Andrzej

46

আপনি যদি কোনও পয়েন্টারকে টাইপডেফিং-এড়িয়ে যান তবে "কদর্যতা" কেড়ে নেওয়া যেতে পারে:

void f() {}
using Function_t = void();    
Function_t* ptr = f;
ptr();

http://ideone.com/e1XuYc


এটি একটি আকর্ষণীয় পদ্ধতি, যদিও আমি উদ্বিগ্ন হতে পারি আমি *পরে ভুলে যাব এবং বিভ্রান্তিকর ত্রুটিগুলি পেয়ে যাব ।
অ্যাপলিগুলি মনিকা

এটি অবশ্যই এখানে উপস্থাপিত সর্বোত্তম সংস্করণ। ধন্যবাদ. এবং আমি একটি পয়েন্টার দেখা পছন্দ করি, কারণ এটি সর্বোপরি একটি ফাংশন পয়েন্টার।
পিয়েরে

13

আপনি একটি চান type-idযা আপনি মুছে ফেলা ব্যতীত মূলত ঘোষণার মতোই একই declarator-id। এটি declarator-idহ'ল একটি শনাক্তকারী এবং নামটি সমতুল্য ঘোষণায় আপনি ঘোষণা করছেন।

উদাহরণ স্বরূপ:

int x

declarator-idহয় xতাই ঠিক এটি অপসারণ:

int

অনুরূপভাবে:

int x[10]

সরান x:

int[10]

আপনার উদাহরণের জন্য:

void (*FunctionPtr)()

এখানে declarator-idহয় FunctionPtr। সুতরাং এটি পেতে কেবল এটি সরিয়ে দিন type-id:

void (*)()

এটি কাজ করে কারণ একটি প্রদত্ত type-idআপনি সর্বদা অনন্যভাবে নির্ধারণ করতে পারবেন কোথায় সনাক্তকারী কোনও ঘোষণা তৈরি করতে যায়। মান 8.1.1 থেকে:

[টাইপ-আইডি] এর অনন্যভাবে অবস্থানটি সনাক্ত করা সম্ভব যেখানে নির্ধারকটি [ঘোষণা] থাকলে সনাক্তকারী উপস্থিত হত। নামযুক্ত টাইপটি তখন অনুমানের শনাক্তকারীর ধরণের সমান।


9

স্পষ্টতার জন্য এই সিনট্যাক্স সম্পর্কে কীভাবে? (নোট ডাবল প্রথম বন্ধনী)

void func();
using FunctionPtr = decltype((func));

1
এই প্রসঙ্গে ডাবল প্রথম বন্ধনীর অর্থ কী? একটি ফাংশন পয়েন্টার একটি রেফারেন্স ?
0x499602D2

5
তোমার FunctionPtrএকটি ফাংশন পয়েন্টার নয়, কিন্তু decltype(&f), দেখ না এখানে
রুবেনভবি

@ 1234597890 ফাংশনপিটিআর 'অকার্যকর ()' টাইপ করার জন্য একটি অবিচ্ছিন্ন লভ্যালু রেফারেন্স
লিও গুডস্ট্যাড

@ রুবেনভ: আপনি ঠিক বলেছেন। এটি কোনও ফাংশন পয়েন্টার নয়, তবে ফাংশনটির (প্রকারের) একটি মূল্যমানের রেফারেন্স। যে কারণে স্ট্যাটিক_সেটর ব্যর্থ হয় ... <br/> ফাংশনপিআরটি ব্যবহার করে চেষ্টা করুন: নাম স্থান এসটিডি ব্যবহার করে; # অন্তর্ভুক্ত <iostream> অকার্যকর do_f () {সারার << "কি? \ n"; } শূন্য চ (); FunctionPtr = decltype ((f)) ব্যবহার করে; FunctionPtr2 = decltype (& f) ব্যবহার করে; // কাজ করে না // FunctionPtr3 = decltype (f) ব্যবহার করে; int main () {FunctionPtr ff = do_f; FF (); FunctionPtr2 ff2 = do_f; ff2 (); }
লিও গুডস্ট্যাড

1

আর একটি পদ্ধতির পিছনে রিটার্ন টাইপের সাথে অটো রিটার্ন টাইপ ব্যবহার করা যেতে পারে।

using FunctionPtr = auto (*)(int*) -> void;

উপনামটি "অটো (*)" দিয়ে আরম্ভ করার পরে এটি কোনও ফাংশন পিটিআর হ'ল কিছু বলার পক্ষে যুক্তিযুক্ত সুবিধা রয়েছে এবং এটি সনাক্তকারী নাম দ্বারা অবিচ্ছিন্ন নয়।

তুলনা করা

typedef someStructureWithAWeirdName& (FunctionPtr*)(type1*, type2**, type3<type4&>);

সঙ্গে

using FunctionPtr = auto (*)(type1*, type2**, type3<type4&>) -> someStructureWithAWeirdName&;

দাবি অস্বীকার: আমি এটি বিন ডিনের "ইজিং ইন মডার্ন সি ++" টক থেকে নিয়েছি

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