Şablon typename bağımsız değişkenine başvuru iletme


16

Referansı şablon türü adı bağımsız değişkenine argüman olarak iletmenin bir yolu var mı? Yani bir int geçmek yerine, örneğin bir int'e bir referans geçirmek için.

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
}

Sınıfta T & yaparak bir işaretçi 'ptr' üye bir referans yapabilir biliyorum, ama bu şablon argüman geçirilen argüman yapılabilir olup olmadığını merak ediyordum.


Kalmak istediğinizi varsayalım decltype, çünkü başlığı tam anlamıyla yazabilirsinizFoo<int*&>
idclev 463035818

Yanıtlar:


19

Arıyorsunuz Foo<decltype(a) &> foo1(a).

Daha belirsiz bir alternatif (bu özel durumda çalışan) Foo<decltype((a))> foo1(a).


1
Ah bu mantıklı, teşekkürler. Decltype ((a)) içindeki çift parantez nasıl çalışır? Bu onu nasıl referans yapar?
Zebrafish

2
@Zebrafish Temel olarak, decltypedeğişken bir ad veya başka bir şey (isteğe bağlı bir ifade) vermenize bağlı olarak farklı çalışır. decltype(a)değişkenin türünü döndürür a(basitçe değişken adı verdiğiniz için). decltype((a)), diğer taraftan, ifadenin değer kategorisini gösteren ek referanslık ile ifadenin türünü (a)(aynı zamanda int) verir. [1/2]
HolyBlackCat

(a)(yanı sıra a), &(x değerleri ile temsil edilir &&; değerler, türü hiç değiştirmez) ile gösterilen bir değerdir. İfadeler hiçbir zaman referans türüne sahip olmadığından, türe referans decltypeekleyebilecek olması çakışmaya neden olamaz. [2/2]
HolyBlackCat

3

Önceki cevaba alternatif olarak std :: reference_wrapper kullanabilirsiniz

std :: reference_wrapper, kopyalanabilir, atanabilir bir nesneye başvuru saran bir sınıf şablonudur. Referansları normalde referansları tutamayan standart kapların (std :: vector gibi) içinde depolamak için bir mekanizma olarak kullanılır.

#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));
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.