Apakah ada cara untuk melewatkan referensi sebagai argumen ke argumen tipe nama template? Maksud saya, alih-alih meneruskan int, misalnya, untuk meneruskan referensi ke 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
}
Saya tahu saya dapat membuat anggota 'ptr' menjadi referensi ke sebuah pointer dengan membuatnya T & di kelas, tapi saya bertanya-tanya apakah ini dapat dilakukan dari argumen yang dilewatkan ke argumen template.
decltype
, karena mengambil judul secara harfiah Anda hanya dapat menulisFoo<int*&>
Jawaban:
Anda sedang mencari
Foo<decltype(a) &> foo1(a)
.Alternatif yang lebih tidak jelas (yang berfungsi dalam kasus khusus ini) adalah
Foo<decltype((a))> foo1(a)
.sumber
decltype
bekerja secara berbeda tergantung pada apakah Anda memberinya nama variabel atau sesuatu yang lain (ekspresi sewenang-wenang).decltype(a)
mengembalikan tipe variabela
(karena Anda hanya memberinya nama variabel).decltype((a))
, di sisi lain, memberi Anda jenis ekspresi(a)
(yang jugaint
), dengan referensi tambahan yang menunjukkan kategori nilai ekspresi. [1/2](a)
(dan jugaa
) adalah nilai, yang ditunjukkan oleh&
(nilai x diwakili oleh&&
, nilai tidak mengubah tipe sama sekali). Karena ekspresi tidak pernah memiliki tipe referensi, fakta yangdecltype
dapat menambahkan referensi ke tipe tidak dapat menyebabkan konflik. [2/2]Sebagai alternatif dari jawaban sebelumnya, Anda dapat menggunakan std :: reference_wrapper
sumber