Apakah ada __CLASS__
makro di C ++ yang memberikan nama kelas mirip dengan __FUNCTION__
makro yang memberikan nama fungsinya
100
Hal terdekat adalah memanggil typeid(your_class).name()
- tetapi ini menghasilkan nama compiler yang rusak spesifik.
Untuk menggunakannya di dalam kelas saja typeid(*this).name()
__func__
dan non-standar__FUNCTION__
bukan makro. Microsoft mendokumentasikan__FUNCTION__
sebagai makro, tetapi manfaatnya tidak benar-benar, adalah ia tidak diperluas oleh preprocessor saat Anda mengompilasi/P
.Masalah dengan penggunaan
typeid(*this).name()
adalah bahwa tidak adathis
pointer dalam panggilan metode statis. Makro__PRETTY_FUNCTION__
melaporkan nama kelas dalam fungsi statis serta panggilan metode. Namun, ini hanya akan berfungsi dengan gcc.Berikut adalah contoh penggalian informasi melalui antarmuka gaya makro.
Makro
__METHOD_NAME__
akan mengembalikan string formulir<class>::<method>()
, memotong jenis pengembalian, pengubah, dan argumen dari apa yang__PRETTY_FUNCTION__
memberi Anda.Untuk sesuatu yang mengekstrak hanya nama kelas, beberapa kehati-hatian harus dilakukan untuk menjebak situasi di mana tidak ada kelas:
sumber
#ifdef __GNU_C__
?substr(0,colons).rfind(" ")
bisa digunakanrfind(' ', colons)
untuk menyisihkan kreasi string ekstra.__METHOD_NAME__
makro yang kemungkinan lebih luas . Cek di sini .constexpr
fungsi ini untuk mengevaluasinya pada waktu kompilasiSaya ingin menyarankan boost :: typeindex , yang saya pelajari dari "Effective Modern C ++" Scott Meyer Berikut adalah contoh dasarnya:
Contoh
Dikompilasi dengan "g ++ --std = c ++ 14" ini menghasilkan yang berikut ini
Keluaran
sumber
Belum. (Saya pikir
__class__
diusulkan di suatu tempat). Anda juga dapat mencoba mengekstrak bagian kelas dari__PRETTY_FUNCTION__
.sumber
Saya pikir menggunakan
__PRETTY_FUNCTION__
cukup baik meskipun termasuk namespace juga yaitunamespace::classname::functionname
sampai__CLASS__
tersedia.sumber
Jika kompilator Anda kebetulan
g++
dan Anda memintanya__CLASS__
karena Anda ingin cara untuk mendapatkan nama metode saat ini termasuk kelas,__PRETTY_FUNCTION__
harus membantu (menurutinfo gcc
, bagian 5.43 Nama Fungsi sebagai String ).sumber
Jika Anda membutuhkan sesuatu yang benar-benar akan menghasilkan nama kelas pada waktu kompilasi, Anda dapat menggunakan C ++ 11 untuk melakukan ini:
Saya menyadari bahwa ini bukan hal yang sama
__FUNCTION__
tetapi saya menemukan posting ini sambil mencari jawaban seperti ini. : Dsumber
Jika Anda berbicara MS C ++ (Anda harus menyatakan, esp sebagai
__FUNCTION__
ekstensi non-standar), ada__FUNCDNAME__
dan__FUNCSIG__
simbol yang dapat Anda parsesumber
Anda bisa mendapatkan nama fungsi termasuk nama kelas. Ini dapat memproses fungsi tipe-C.
sumber
Solusi saya:
Saya bekerja untuk Visual C ++ 12.
sumber
Berikut adalah solusi berdasarkan
__FUNCTION__
makro dan template C ++:Berikut adalah contoh bagaimana ini dapat digunakan untuk kelas logger
Output dari
Example::Run
akan menjadisumber
Ini bekerja dengan baik jika Anda bersedia membayar biaya penunjuk.
sumber
Bekerja dengan pnidui dan gcc juga
sumber
Semua solusi yang diposting di atas yang bergantung pada
__PRETTY_FUNCTION__
do memiliki case edge tertentu di mana solusi tersebut tidak mengembalikan nama kelas / nama kelas saja. Misalnya, pertimbangkan nilai fungsi cantik berikut:Menggunakan kejadian terakhir
"::"
sebagai pembatas tidak akan berfungsi karena parameter fungsi juga berisi a"::"
(std::string
). Anda dapat menemukan kasus tepi serupa untuk"("
pembatas dan lainnya. Satu-satunya solusi yang saya temukan menggunakan makro__FUNCTION__
dan__PRETTY_FUNCTION__
sebagai parameter. Ini kode lengkapnya:sumber
Metode berikut (berdasarkan methodName () di atas) juga dapat menangani input seperti "int main (int argc, char ** argv)":
sumber