“……” টোকেনটির অর্থ কী? অর্থাত প্যারামিটার প্যাকে ডাবল উপবৃত্তাকারী অপারেটর


110

নতুন সিসি ++ 11 শিরোনামের গিগিটির বর্তমান প্রয়োগের মাধ্যমে ব্রাউজ করার সময়, আমি "......" টোকেনকে হোঁচট খেয়েছি। আপনি যাচাই করতে পারেন, যে নিম্নলিখিত কোডটি সূচকগুলি [আদর্শ আইটেম ডটকমের মাধ্যমে] সংকলন করে

template <typename T>
struct X
{ /* ... */ };

template <typename T, typename ... U>
struct X<T(U......)> // this line is the important one
{ /* ... */ };

তো, এই টোকেনটির অর্থ কী?

সম্পাদনা: দেখে মনে হচ্ছে এসও ছাঁটাই হয়েছে "......" প্রশ্নের শিরোনামে "...", আমি আসলে "......" বলতে চাইছিলাম। :)


ইঙ্গিত: এটি ...অনুসরণ করা হয় ...
আলেকজান্দ্রি সি

5
এটি কি U...অনুসরণ করে বেশি পছন্দ করে না ...? তবুও খুব বিজোড়।
এডিএ-কিএ মর্ট-ওরা-ই

1
দ্রষ্টব্য: এই খুঁজে পাওয়া যেতে পারে <functional>এবং <type_traits>, সবসময় একটি টেমপ্লেট প্যারামিটার ভিতরে একটি ফাংশন আর্গুমেন্ট তালিকার প্রেক্ষাপটে।
পোটোটোভটার

আমি এটি শিরোনামে আটকে থাকার একমাত্র উপায় হ'ল অন্তঃসত্ত্বার মধ্যে একটি স্থান স্থাপন করা ... আশা করি এটি পাঠকদের জন্য আরও স্পষ্ট করে তুলেছে।
ম্যাথিউ এম।

@ ম্যাথিউ এম: ধন্যবাদ, অনেক ভাল!
ভিটাস

উত্তর:


79

অদ্ভুততার প্রতিটি উদাহরণ নিয়মিত একক উপবৃত্তির কেসের সাথে জুড়ে দেওয়া হয়।

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes...)>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes......)>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes...) const>
    { typedef _Res result_type; };

  template<typename _Res, typename... _ArgTypes>
    struct _Weak_result_type_impl<_Res(_ArgTypes......) const>
    { typedef _Res result_type; };

আমার অনুমান যে ডাবল উপবৃত্তির অর্থ একই রকম _ArgTypes..., ..., অর্থাত্ সি-স্টাইলের ভেরাগস তালিকার পরে একটি ভেরিয়াদিক টেম্পলেট সম্প্রসারণ।

এখানে সেই তত্ত্বকে সমর্থনকারী একটি পরীক্ষা রয়েছে ... আমার মনে হয় আমাদের নিকৃষ্টতম সিউডো-অপারেটরের জন্য নতুন বিজয়ী রয়েছে।

সম্পাদনা করুন: এটি সামঞ্জস্যপূর্ণ বলে মনে হচ্ছে। §8.3.5 / 3 প্যারামিটার তালিকাটি তৈরি করার একটি উপায় বর্ণনা করে

প্যারামিটার-ঘোষণা-তালিকা opt ... অপ্ট

সুতরাং ডাবল-উপবৃত্ত একটি প্যারামিটার-ডিক্লেয়ারেশন-তালিকা দ্বারা গঠিত হয় যা প্যারামিটার প্যাকের সাথে সমাপ্ত হয় এবং তার পরে অন্য উপবৃত্তাকার হয়।

কমা খাঁটি optionচ্ছিক; §8.3.5 / 4 বলে

যেখানে সিনথেটিকভাবে সঠিক এবং যেখানে "..." কোনও বিমূর্ত-ঘোষণাকারীর অংশ নয়, ", ..." "..." এর সমার্থক শব্দ।

এই হল একটি বিমূর্ত-declarator মধ্যে [সম্পাদনা] কিন্তু জোহানেস একটি ভাল পয়েন্ট যে তারা একটি পরামিতির-ঘোষণা মধ্যে একটি বিমূর্ত-declarator উল্লেখ করা হয় তোলে। আমি অবাক হয়েছি কেন তারা "প্যারামিটার-ঘোষণার অংশ" বলেন নি এবং কেন এই বাক্যটি কেবল একটি তথ্যমূলক নোট নয় ...

তদ্ব্যতীত, va_begin()মধ্যে <cstdarg>একটি প্যারামিটার প্রয়োজন সামনে তালিকা ভারার্গস, তাই প্রোটোটাইপ f(...)বিশেষভাবে C দ্বারা মঞ্জুরিপ্রাপ্ত ++, অনর্থক। সি 99 এর সাথে ক্রস-রেফারেন্সিং এটি প্লেইন সি-তে অবৈধ So তাই, এটি সবচেয়ে উদ্ভট।

ব্যবহার নোট

অনুরোধ করে, এখানে ডাবল উপবৃত্তের একটি প্রদর্শন রয়েছে:

#include <cstdio>
#include <string>

template< typename T >
T const &printf_helper( T const &x )
    { return x; }

char const *printf_helper( std::string const &x )
    { return x.c_str(); }

template< typename ... Req, typename ... Given >
int wrap_printf( int (*fn)( Req... ... ), Given ... args ) {
    return fn( printf_helper( args ) ... );
}

int main() {
    wrap_printf( &std::printf, "Hello %s\n", std::string( "world!" ) );
    wrap_printf( &std::fprintf, stderr, std::string( "Error %d" ), 5 );
}

হ্যা, তা ঠিক. টি (ইউ ..., ...) তবে জরিমানাও সংকলন করে; সম্ভবত তারা কিছু জায়গা বাঁচাতে চেয়েছিল। :)
ভিটাস

1
তবে তার মানে কী? এবং সংস্থাপকটি কীভাবে বলতে পারবেন যে _আরগটাইপগুলি কোথায় শেষ হয় এবং কিছু "অতিরিক্ত" পরামিতি শুরু হয়?
বো পারসন

12
@Bo Persson: std::is_functionএর valueএমনকি যদি ফাংশন সি এক ভারার্গস এবং কারণ টি (ইউ ...) হয় অবশ্যই সঠিক হতে হবে না এমন ফাংশন জন্য মেলে, আপনি এই পাগলামি প্রয়োজন। উদাহরণস্বরূপ F (int, চর, ...) টি (ইউ ......) এর সাথে টি = ইন্ট, ইউ = {ইন্ট, চর} এবং "..." ভারার্গস টোকেনের সাথে মেলে।
ভিটাস

4
"এই হল একটি বিমূর্ত-declarator মধ্যে" -> তারা যে একই প্যারামিটার প্রকার তালিকার সর্বশেষ প্যারামিটারের বিমূর্ত declarator অংশ নয় মানে। যেমন void (int...)এখানে, ...বিমূর্ত-ঘোষণাকারীর অংশ নয় int, তাই এটি এর সমার্থক void(int, ...)। আপনি যদি লেখেন void(T...)এবং Tএকটি টেম্পলেট প্যারামিটার প্যাক ...হন তবে এটি বিমূর্ত-ঘোষণাকারীর অংশ হতে পারে এবং তাই এটি সমতুল্য হবে না void(T, ...)
জোহানেস স্কাউব -

2
"তদ্ব্যতীত, <cstdarg> এ va_begin () এর জন্য Varargs তালিকার আগে একটি প্যারামিটার প্রয়োজন, সুতরাং C ++ দ্বারা অনুমোদিত প্রোটোটাইপ f (...) অকেজো।" - আপনি কেবল কী যুক্তি পাস করেছেন তা জানতে চাইলে এটি কেবল অকেজো। f(...)টেমপ্লেট মেটাগ্রেমিংয়ে ফ্যালব্যাক ফাংশন ওভারলোড হিসাবে ভারী ব্যবহৃত হয়, যেখানে এই তথ্যটি প্রয়োজনীয় নয় (এবং যেখানে ফাংশনটি এমনকি আসলে কল হয় না)।

4

vs2015 এ কমা পৃথক করা টেম্পলেট সংস্করণে প্রয়োজনীয়:

    template <typename T, typename ... U>
    struct X<T(U...,...)> {};// this line is the important one

একটি উদাহরণ ইনস্ট্যান্টেশন হল:

    X<int(int...)> my_va_func;

শুভেচ্ছা, এফএম।


আমি এটি খুব লক্ষ্য করেছি, এটি এখনও ঘটে। বেক প্রতিবেদনটি ডেভেলপারকোমিউটি.ভিউজুয়ালস্টুডিও . com/ কনটেন্ট / প্রব্লেম / 72৩72২60০০ / at
egyik

জানা ভাল. এই সম্পর্কে স্ট্যান্ডাডসের কোনও রেফারেন্স বা উদ্ধৃতি?
রেড.ভ্যাভ

.سلام ببخشید نمیدانم
এ্যাজিক

এটি একটি পাবলিক ফোরাম। লোকেরা আপনার মতামত পড়তে দিন। PLZ ব্যক্তিগত বার্তাগুলির জন্য নেটিভ ল্যাং রাখুন। سپاس।
Red.Wave

ঠিক আছে তাহলে। আমি স্ট্যান্ডার্ড সম্পর্কে কোনও বিশেষজ্ঞ নই - আমি মনে করি যে অন্যরা এটি উপরের কিছু বিশদে আবৃত করেছেন। যদি কেউ মাইক্রোসফ্ট সমস্যার প্রতিবেদনে মন্তব্য করতে আগ্রহী তবে এটি তার অগ্রাধিকার বাড়িয়ে তুলতে পারে। প্রতিবেদনে ঝাঁকুনি এবং জিসিসি দেখায় যা ভিসি ++ না দেয় তাই আমি মনে করি আমরা সম্ভবত বেশ শক্তিশালী স্থানে রয়েছি।
egyik
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.