Bagaimana dengan jenis varian yang diberikan
using V = std::variant<bool, char, std::string, int, float, double, std::vector<int>>;
mendeklarasikan dua tipe varian
using V1 = std::variant<bool, char, int, float, double>;
using V2 = std::variant<std::string, std::vector<int>>;
dari mana V1
menyertakan semua jenis aritmatika dari V
dan V2
termasuk semua jenis non-aritmatika dari V
?
V
bisa menjadi parameter kelas templat, misalnya:
template <class V>
struct TheAnswer
{
using V1 = ?;
using V2 = ?;
};
secara umum kriteria dapat berupa constexpr
variabel seperti ini:
template <class T>
constexpr bool filter;
c++
c++17
std-variant
Alexey Starinsky
sumber
sumber
Types...
dalamnyastd::variant
secara langsung, seperti ini ?std::variant
tidak terbentuk dengan baik.std::variant<>
, jadi saya jelas. Saya akan men-tweak ituV1
danV2
jatuh kembali kestd::variant<std::monostate>
olah.Dengan Boost.Mp11 , ini adalah one-liner pendek (seperti biasa):
Anda juga bisa menggunakan:
untuk membuat keduanya lebih simetris.
Kalau tidak,
sumber
mp_filter
?EDIT Mengingat bahwa varian kosong (
std::variant<>
) sedang terbentuk (menurut cppreference ) dan yang seharusnya digunakanstd::variant<std::monostate>
, saya telah memodifikasi jawabannya (menambahkantuple2variant()
spesialisasi untuk tuple kosong) untuk mendukung kasus ketika daftar jenisV1
atauV2
kosong.Ini sedikit
decltype()
mengigau tapi ... jika Anda mendeklarasikan beberapa filter helper berfungsi sebagai berikutdan fungsi tuple to varian (dengan spesialisasi untuk tuple kosong, untuk menghindari yang kosong
std::variant
)kelas Anda hanya (?) menjadi
Jika Anda menginginkan sesuatu yang lebih umum (jika Anda ingin meneruskan
std::arithmetic
sebagai parameter templat), Anda dapat memodifikasifilterArithm()
fungsi yang melewati parameter filter templat-templatF
(diganti namanyafilterType()
)The
TheAnswer
kelas menjadidan
TA
deklarasi juga berlakustd::is_arithmetic
Berikut ini adalah contoh kompilasi lengkap dengan
std::is_arithmetic
sebagai parameter danV2
case kosongsumber
void
.void
, sejauh yang saya tahu, dilarang sebagai ketik astd::variant
.std::variant<void>
itu buruk, tetapi tampaknya baikstd::variant<>
-baik saja jika definisi tidak dipakai .