কোনও টেম্পলেট টাইপনেম যুক্তির রেফারেন্স কীভাবে পাস করবেন


15

কোনও টেম্পলেট টাইপনেম যুক্তির পক্ষে আর্গুমেন্ট হিসাবে রেফারেন্সটি পাস করার কোনও উপায় আছে কি? আমি এর অর্থ একটি int পাস করার পরিবর্তে, উদাহরণস্বরূপ, কোনও int এর একটি রেফারেন্স পাস করা।

template <typename T>
struct Foo
{
    Foo(T arg) : ptr(arg) {}
    T ptr;
};

int main() 
{
    int* a = new int(6);
    Foo<decltype(a)> foo1(a); // ptr is a copy of a pointer
    Foo<decltype(&a)> foo1(&a); // ptr seems to be a pointer to a pointer
}

আমি জানি যে আমি 'পিটিআর' সদস্যটিকে পয়েন্টারটির টি ও ক্লাসে তৈরি করে একটি রেফারেন্স হিসাবে তৈরি করতে পারি, তবে আমি ভাবছিলাম যে এটি টেম্পলেট আর্গুমেন্টে পাস হওয়া যুক্তি থেকে করা যায় কিনা।


আমি মনে করি আপনি সাথে থাকতে চান decltype, কারণ শিরোনামটি আক্ষরিক অর্থে আপনি লিখতে পারেনFoo<int*&>
idclev 463035818

উত্তর:


18

আপনি খুজছেন Foo<decltype(a) &> foo1(a)

আরও একটি অস্পষ্ট বিকল্প (যা এই নির্দিষ্ট ক্ষেত্রে কাজ করে) Foo<decltype((a))> foo1(a)


1
আহ যে বোঝায়, ধন্যবাদ। ডিক্লাইপ টাইপ ((ক)) এ ডাবল বন্ধনী কীভাবে কাজ করবে? কীভাবে এটি এটিকে একটি রেফারেন্স বানায়?
জেব্রাফিশ

2
@ জেব্রাফিশ মূলত, decltypeআপনি এটির পরিবর্তনশীল নাম বা অন্য কিছু (একটি স্বেচ্ছাসেবী প্রকাশ) দেন কিনা তার উপর নির্ভর করে ভিন্নভাবে কাজ করে। decltype(a)ভেরিয়েবলের প্রকারটি প্রদান করে a(কারণ আপনি কেবল এটিকে একটি চলক নাম দিয়েছেন)। decltype((a))অন্যদিকে, আপনাকে এক্সপ্রেশনটির ধরণ দেয় (a)(যা এটিও int), যোগ করা রেফারেন্স-নেস যা অভিব্যক্তির মান বিভাগকে নির্দেশ করে। [1/2]
হলি ব্ল্যাককিট

(a)(পাশাপাশি পাশাপাশি a) একটি লভ্যালু, যা দ্বারা নির্দেশিত হয় &(এক্সাল্যুগুলি প্রতিনিধিত্ব করে &&, মূল্যগুলি কোনও প্রকারটি পরিবর্তন করে না)। যেহেতু এক্সপ্রেশনগুলির মধ্যে কখনই রেফারেন্স প্রকার থাকে না, তাই প্রকারের মধ্যে decltypeরেফারেন্স-নেস যুক্ত করতে পারে এমন কোনও বিরোধের কারণ হতে পারে না। [2/2]
হলি ব্ল্যাককিট

2

পূর্ববর্তী উত্তরের বিকল্প হিসাবে, আপনি স্টাডি :: রেফারেন্স_ওয়ার্পার ব্যবহার করতে পারেন

স্টাড :: রেফারেন্স_ওয়ার্পার একটি শ্রেণিবদ্ধ টেমপ্লেট যা একটি অনুলিপিযোগ্য, কার্যনির্বাহ্য অবজেক্টে একটি রেফারেন্সকে আবৃত করে। এটি প্রায়শই স্ট্যান্ডার্ড পাত্রে (স্ট্যান্ড :: ভেক্টর) রেফারেন্সগুলি সংরক্ষণ করার ব্যবস্থা হিসাবে ব্যবহৃত হয় যা সাধারণত রেফারেন্স রাখতে পারে না।

#include <functional>

template <typename T>
struct Foo
{
  Foo(T arg) : ptr(arg)
  {
  }
  T ptr;
};

int main()
{
  int* a = new int(6);

  Foo<std::reference_wrapper<int*>> foo1(std::ref(a));
  foo1.ptr[0] = 1;  // ok

  // This also works
  int* b = new int(6);
  Foo<std::reference_wrapper<decltype(b)>> foo2(std::ref(b));
  // and this too
  foo1 = foo2;

  // Or, if you use c++17, even this
  Foo foo3(std::ref(b));
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.