সি ++ 11: ভারিয়াদিক টেম্পলেট ফাংশন পরামিতিগুলির সংখ্যা?


87

আমি কীভাবে একটি বৈকল্পিক টেম্পলেট ফাংশনটিতে যুক্তির সংখ্যার একটি গণনা পেতে পারি?

অর্থাত:

template<typename... T>
void f(const T&... t)
{
    int n = number_of_args(t);

    ...
}

number_of_argsউপরোক্ত ক্ষেত্রে কার্যকর করার সবচেয়ে ভাল উপায় কী ?



21
@ আর। মার্টিনহো ফার্নান্দেস "আপনার উত্তর পোস্ট করুন" ফর্মটি পৃষ্ঠার নীচে কিছুটা ইঞ্চি is ;)
কে

@ কে-সিসেভিল আমি বুঝতে পারি না কেন আপনার মন্তব্যে তার চেয়ে কম আপোস রয়েছে।
নীলা_ব্রীক

উত্তর:


104

শুধু এটি লিখুন:

const std::size_t n = sizeof...(T); //you may use `constexpr` instead of `const`

দ্রষ্টব্য এটি nএকটি ধ্রুবক অভিব্যক্তি (যেমন সংকলন সময়ে জানা), যার অর্থ আপনি যেখানে ধ্রুবক অভিব্যক্তি প্রয়োজন সেখানে এটি ব্যবহার করতে পারেন যেমন:

std::array<int,   n>  a; //array of  n elements
std::array<int, 2*n>  b; //array of (2*n) elements

auto middle = std::get<n/2>(tupleInstance);

মনে রাখবেন যে আপনি যদি প্যাকযুক্ত ধরণের ( প্যাকের ধরণের সংখ্যার বিপরীতে ) একত্রিত আকারের গণনা করতে চান , তবে আপনাকে এই জাতীয় কিছু করতে হবে:

template<std::size_t ...>
struct add_all : std::integral_constant< std::size_t,0 > {};

template<std::size_t X, std::size_t ... Xs>
struct add_all<X,Xs...> : 
  std::integral_constant< std::size_t, X + add_all<Xs...>::value > {};

তাহলে এটি করুন:

constexpr auto size = add_all< sizeof(T)... >::value;

সি ++ ১ ((এবং তারপরে) এ, ধরণের আকারের সমষ্টি গণনা করা ভাঁজ এক্সপ্রেশন ব্যবহার করে আরও সহজ :

constexpr auto size = (sizeof(T) + ...);

আশা করি এইটি কাজ করবে.


9
+1 দুটি জিনিস শিখেছি; sizeof...এবং constexpr। :)
কিউস - মনিকা

4
সুতরাং এটি sizeof...আসলে আর্গুমেন্টের সংখ্যাটি দেয় এবং সমস্ত আর্গুমেন্টের সম্মিলিত স্টোরেজ আকার নয় ( sizeofকোনও অ্যারের মতো হবে)?
পানজি

@ পাঞ্জি: হ্যাঁ sizeof ...(T)আয় সংখ্যা ধরনের বস্তাবন্দী T। আপনি যদি প্যাক করা ধরণের সংখ্যক আকারের গণনা করতে চান, তবে আপনাকে এই জাতীয় কিছু করতে হবে: ideone.com/udggBk আমি এটি আমার উত্তরটিতেও যুক্ত করেছি।
নওয়াজ

@ পাঞ্জি: আমার উত্তরের গণনা এখন কিছুটা উন্নত হয়েছে।
নওয়াজ

4
সি ++ 17 দিয়ে পৃথক আরগের ধরণের আকার গণনা করতে এখন আমরা ভাঁজ এক্সপ্রেশনগুলি ব্যবহার করতে পারি return (0 + ... + sizeof(t));
P0W
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.