Apakah mungkin untuk mendeklarasikan dua variabel dari tipe yang berbeda di tubuh inisialisasi dari for for di C ++?
Sebagai contoh:
for(int i=0,j=0 ...
mendefinisikan dua bilangan bulat. Bisakah saya mendefinisikan int
dan char
di dalam tubuh inisialisasi? Bagaimana ini akan dilakukan?
c++
scope
declaration
for-loop
Nathan Osman
sumber
sumber
-std=c++0x
) dalam bentukfor(auto i=0, j=0.0; ...
, tetapi kemungkinan ini dihapus dalam g ++ - 4.5 untuk bertepatan dengan teks c ++ 0x.Jawaban:
C ++ 17 : Ya! Anda harus menggunakan deklarasi mengikat terstruktur . Sintaks telah didukung dalam gcc dan dentang selama bertahun-tahun (sejak gcc-7 dan dentang-4.0) ( contoh dentang hidup ). Ini memungkinkan kita untuk membongkar tuple seperti:
Di atas akan memberi Anda:
int i
mulai1
double f
mulai1.0
std::string s
mulai"ab"
Pastikan
#include <tuple>
untuk deklarasi semacam ini.Anda dapat menentukan jenis persis di dalam
tuple
dengan mengetik semuanya seperti yang saya miliki denganstd::string
, jika Anda ingin memberi nama jenis. Sebagai contoh:Aplikasi spesifik ini adalah iterasi di atas peta, mendapatkan kunci dan nilai,
Lihat contoh langsung di sini
C ++ 14 : Anda dapat melakukan hal yang sama seperti C ++ 11 (di bawah) dengan penambahan berbasis tipe
std::get
. Jadi alih-alihstd::get<0>(t)
dalam contoh di bawah ini, Anda bisa memilikinyastd::get<int>(t)
.C ++ 11 :
std::make_pair
memungkinkan Anda melakukan ini, jugastd::make_tuple
untuk lebih dari dua objek.std::make_pair
akan mengembalikan dua argumen dalamstd::pair
. Elemen-elemen dapat diakses dengan.first
dan.second
.Untuk lebih dari dua objek, Anda harus menggunakan a
std::tuple
std::make_tuple
adalah templat variadic yang akan membuat tuple dari sejumlah argumen (dengan beberapa batasan teknis tentunya). Elemen-elemen dapat diakses dengan indeks denganstd::get<INDEX>(tuple_object)
Di dalam for loop body Anda dapat dengan mudah alias objek, meskipun Anda masih perlu menggunakan
.first
ataustd::get
untuk kondisi loop dan memperbarui ekspresiC ++ 98 dan C ++ 03 Anda dapat secara eksplisit memberi nama jenis a
std::pair
. Tidak ada cara standar untuk menggeneralisasi ini ke lebih dari dua jenis:sumber
make_
dan menulisstd::pair(1, 1.0)
.Tidak - tetapi secara teknis ada solusi (bukan berarti saya benar-benar menggunakannya kecuali dipaksa):
sumber
struct { int a=0; char b='a'; } s;
Tidak mungkin, tetapi Anda dapat melakukan:
Atau, secara eksplisit membatasi ruang lingkup
f
dani
menggunakan tanda kurung tambahan:sumber
Anda tidak dapat mendeklarasikan beberapa tipe dalam inisialisasi, tetapi Anda dapat menetapkan beberapa tipe EG
Cukup deklarasikan mereka dalam ruang lingkup mereka sendiri.
sumber
Saya pikir pendekatan terbaik adalah jawaban xian .
tapi...
# Bersarang untuk loop
Pendekatan ini kotor, tetapi bisa menyelesaikan semua versi.
jadi, saya sering menggunakannya di fungsi makro.
Tambahan 1.
Ini juga dapat digunakan untuk
declare local variables
daninitialize global variables
.Tambahan 2.
Contoh bagus: dengan fungsi makro.
(Jika pendekatan terbaik tidak dapat digunakan karena itu adalah untuk-loop-makro)
# Trik If-statement
Jika Anda ingin menginisialisasi
0
ataunullptr
, Anda dapat menggunakan trik ini.tetapi saya tidak merekomendasikan ini karena sulit membaca.
dan sepertinya bug.
sumber
Lihat " Apakah ada cara untuk mendefinisikan variabel dari dua jenis dalam untuk loop? " Untuk cara lain yang melibatkan multiple bersarang untuk loop. Keuntungan dari cara lain selain "trik trik" Georg adalah bahwa itu (1) memungkinkan Anda untuk memiliki campuran variabel lokal statis dan non-statis dan (2) itu memungkinkan Anda untuk memiliki variabel yang tidak dapat disalin. The downside adalah bahwa itu jauh lebih mudah dibaca dan mungkin kurang efisien.
sumber
Tentukan makro:
Ingat saja, cakupan variabel Anda tidak akan berada dalam for loop dengan cara ini juga.
sumber
{
dan}
.Anda juga dapat menggunakan seperti di bawah ini di C ++.
sumber