Как по заданному варианту
using V = std::variant<bool, char, std::string, int, float, double, std::vector<int>>;
объявить два варианта типа
using V1 = std::variant<bool, char, int, float, double>;
using V2 = std::variant<std::string, std::vector<int>>;
где V1
включает в себя все арифметические типы из V
и V2
включает в себя все неарифметические типы из V
?
V
может быть параметром класса шаблона, например:
template <class V>
struct TheAnswer
{
using V1 = ?;
using V2 = ?;
};
в общем случае критерии могут быть constexpr
такими:
template <class T>
constexpr bool filter;
c++
c++17
std-variant
Алексей старинский
источник
источник
Types...
внутриstd::variant
прямо, как это ?std::variant
плохо сформировано.std::variant<>
плохо сформировано, так что я в чистоте . Я настрою это такV1
иV2
вернусь к этомуstd::variant<std::monostate>
.С Boost.Mp11 это короткий однострочный (как всегда):
Вы также можете использовать:
сделать два более симметричными.
С другой стороны,
источник
mp_filter
основано?РЕДАКТИРОВАТЬ Учитывая, что пустой вариант (
std::variant<>
) плохо сформирован (в соответствии с cppreference ), и его следует использоватьstd::variant<std::monostate>
вместо этого, я изменил ответ (добавилtuple2variant()
специализацию для пустого кортежа), чтобы поддержать случай, когда список типов дляV1
илиV2
пуст.Это немного
decltype()
бред, но ... если вы объявите пару вспомогательных фильтров следующим образоми функция кортежа к варианту (со специализацией для пустых кортежей, чтобы избежать пустых
std::variant
)ваш класс просто (?) стал
Если вы хотите что-то более общее (если вы хотите передать
std::arithmetic
в качестве параметра шаблона), вы можете изменитьfilterArithm()
функцию, передав параметр фильтра template-templateF
(переименованныйfilterType()
)TheAnswer
Класс стали
TA
декларацию возьмите такжеstd::is_arithmetic
Ниже приведен полный пример компиляции с
std::is_arithmetic
параметром as иV2
пустым регистром.источник
void
.void
Насколько я знаю, запрещено вводить в качествеstd::variant
.std::variant<void>
он плохо сформирован, но, кажется,std::variant<>
все в порядке, если его определение не было создано .