Sangat mudah untuk membuat nama baru untuk sebuah tipe, variabel, atau namespace. Tapi bagaimana cara menetapkan nama baru ke suatu fungsi? Misalnya, saya ingin menggunakan nama holler
untuk printf
. #define sudah jelas ... ada cara lain?
Solusi:
#define holler printf
void (*p)() = fn; //function pointer
void (&r)() = fn; //function reference
inline void g(){ f(); }
void (&NewName)(some_vector&, float, float, float, float) = OldName;
di check-in berikutnya.printf
sini. Itu hanya sebuah contoh. Masalahnya di sini lebih berkaitan dengan keterbatasan bahasa Inggris daripada hal lainnya. Saya memiliki satu fungsi yang melayani tujuan A dan tujuan B tetapi saya tidak dapat menemukan satu nama pun yang melayani kedua tujuan di sini.T &a = b;
membuat nama baru untukb
.typedef
untuk tipe dannamespace A=B;
namespace.using BaseClass::BaseClassMethod
, dan adausing AliasType = Type;
, dan bahkan adanamespace AliasNamespace = Namespace;
. Apa yang kami lewatkan adalahusing AliasFunction = Function;
Jawaban:
Ada pendekatan yang berbeda:
Dengan C ++ 11 dengan fungsi non-template non-overloaded, Anda cukup menggunakan:
Jika fungsi ini memiliki banyak kelebihan, Anda harus menggunakan
static_cast
:Contoh: ada dua kelebihan fungsi
std::stoi
Jika Anda ingin membuat alias ke versi pertama Anda harus menggunakan yang berikut ini:
Catatan: tidak ada cara untuk membuat alias ke fungsi yang kelebihan beban sedemikian rupa sehingga semua versinya yang kelebihan beban berfungsi, jadi Anda harus selalu menentukan fungsi yang kelebihan beban yang Anda inginkan.
Dengan C ++ 14 Anda dapat melangkah lebih jauh dengan
constexpr
variabel template. Itu memungkinkan Anda untuk membuat alias fungsi kerangka:Selain itu, dimulai dengan C ++ 11 Anda memiliki fungsi yang dipanggil
std::mem_fn
yang memungkinkan fungsi anggota alias. Lihat contoh berikut:sumber
constexpr
pendekatan variabel template: alias tidak dapat melakukan pengurangan tipe. Kompiler mengharuskan saya untuk memberikan daftar parameter template (Saya menulis fungsi template variadic): tidak dapat merujuk ke template variabel `alias_to_old 'tanpa daftar argumen templateconstexpr auto new_fn_name = old_fn_name
bekerja di C ++ 11 (setidaknya di gcc 4.9.2) dan lebih baik daripada menempatkan&
. Itu tidak memerlukan panggilan untuk selalu dilakukan melalui pointer dan dengan demikian memungkinkan fungsi menjadi sebaris di tempat panggilan.constexpr auto holler = [] ( auto &&...args ) { return printf( std::forward<decltype(args)>( args )... ); };
std::mem_fn
ini bukan alias karena melakukan jauh lebih ajaib balik arti.Anda dapat membuat penunjuk fungsi atau referensi fungsi:
sumber
fn
, menggunakan alias? Bisakah Anda menjelaskan penunjuk fungsi & referensi fungsi? Bagaimana mereka berbeda? Apakah mereka sama di sini?r();
void (&r)() = this->fn;
Haruskah kamu baik-baik saja.
sumber
decltype
seperti yang diperkenalkan di c ++ 11. Selain itu, ini juga harus bekerja dengan C. dataran tua yang bagusint (*holler)(const char*, ...) = std::printf;
sumber
Gunakan pembungkus sebaris. Anda mendapatkan kedua API tersebut, tetapi tetap mempertahankan penerapan tunggal.
sumber
Dari fluentcpp : ALIAS_TEMPLATE_FUNCTION (f, g)
sumber
Dengan lambda generik C ++ 14, saya dapat melakukan hal berikut, yang seharusnya juga berfungsi ketika fungsi target memiliki beberapa kelebihan beban:
sumber
Perlu disebutkan di sini IMO bahwa sementara pertanyaan asli (dan jawaban yang bagus) pasti berguna jika Anda ingin mengganti nama suatu fungsi (ada alasan bagus untuk melakukannya!), Jika semua yang ingin Anda lakukan adalah menghapus namespace yang dalam tetapi simpan namanya, ada
using
kata kunci untuk ini:Ini juga memiliki keuntungan karena terbatas pada ruang lingkup, meskipun Anda selalu dapat menggunakannya di tingkat atas file. Saya sering menggunakan ini untuk
cout
danendl
jadi saya tidak perlustd
memasukkan SEMUA dengan yang klasikusing namespace std;
di bagian atas file, tetapi juga berguna jika Anda menggunakan sesuatu sepertistd::this_thread::sleep_for()
banyak dalam satu file atau fungsi, tetapi tidak di semua tempat, dan bukan fungsi lain dari namespace. Seperti biasa, tidak disarankan untuk menggunakannya dalam file .h, atau Anda akan mencemari namespace global.Ini tidak sama dengan "penggantian nama" di atas, tetapi sering kali yang benar-benar diinginkan.
sumber