Saya mencoba untuk mendefinisikan suatu fungsi menggunakan template dan saya ingin nama ketik menjadi int atau anEnum (enum spesifik yang telah saya tetapkan). Saya sudah mencoba yang berikut tetapi saya gagal:
template <int | anEnum T> // or <int T, anEnum T> or <int, anEnum T>
bool isFunction(const T &aVariable){}
Apa yang saya coba lakukan adalah menggunakan template, alih-alih mendefinisikan dua fungsi yang kelebihan beban. Saya lebih suka fungsi dipanggil sebagai berikut, tanpa programmer harus mempertimbangkan jenisnya
isFunction(aVariable) // and not isFunction<int> (aVariable) nor isFunction<anEnum> (aVariable)
Pada dasarnya, saya ingin fungsi ini digunakan untuk tipe int dan aNum. Saya telah mencari ini, tetapi tidak dapat menemukan jawabannya. Apa yang mungkin saya lewatkan? Terima kasih,
false
untuk jenis lain atau ingin tidak instantiate fungsi untuk jenis lain.Jawaban:
Selain jawaban non-C ++ 20, jika Anda, secara kebetulan, dapat menggunakan C ++ 20 dan
concepts
fiturnya, saya akan menyarankan Anda penerapan berikut:Demo
MEMPERBARUI
Menurut komentar @RichardSmith , berikut ini adalah pendekatan yang lebih terukur dan dapat digunakan kembali:
sumber
template<typename T, typename ...U> concept one_of = (std::is_same_v<T, U> || ...);
template<one_of<int, MyEnum> T> bool isFunction(T const& aVariable) {
Ada beberapa cara untuk mencapai ini. Semua melibatkan penggunaan
type_traits
header. Misalnya, Anda dapat menegaskan secara statis tentang jenis yang dimaksud di badan fungsi.Atau, jika Anda perlu mempertimbangkan fungsi ini di antara kelebihan beban lainnya, teknik SFINAE dapat digunakan.
Ini akan menghapus fungsi dari set overload sebelum dipanggil jika tipe tidak cocok. Tetapi jika Anda tidak memerlukan perilaku ini, pernyataan statis memang memungkinkan untuk pesan kesalahan yang lebih ramah programmer.
sumber
Bagaimana dengan solusi ini? Kode dengan fungsi akan dikompilasi jika tipe T memenuhi syarat Anda. Jika tidak, pernyataan statis gagal.
sumber
isFunction(std::string_view)
). Tanda tangan masih akan menjadi kecocokan yang valid, tetapi instantiasi menyebabkan kesalahan.Saya telah meningkatkan https://stackoverflow.com/a/60271100/12894563 jawaban. 'Jika constexpr' dapat membantu dalam situasi ini:
isFunction (1L) akan gagal karena tidak ada fungsi kelebihan beban atau cabang 'jika constexpr'.
UPDATE: Tetap terjawab
https://godbolt.org/z/eh4pVn
sumber
static_assert(false, ...)
adalah NDR yang buruk, bahkan tanpa digunakan. Jika Anda beruntung, kompiler Anda akan memberitahu Anda segera, seperti dentang tidak, godbolt.org/z/m_Gk9n