это то, что я хочу, а «переключатель» тип признака, который возвращает первый тип, который имеет состояние == TRUE:реализации выключателю типа признака (с станд :: conditional_t цепи вызовов)
ext::select_t<condition1 == true, Type1,
condition2 == true, type2,
condition3 == true, type3>
и т.д. , и иметь возможность добавить столько пар параметров/типов, сколько захочу.
я могу сделать это с помощью станд :: условном как таковой (случайный пример):
template<typename Number,
typename Distribution = std::conditional_t<
// IF
std::is_integral<Number>::value,
// RETURN INT
std::uniform_int_distribution<Number>,
// ELSE
std::conditional_t<std::is_floating_point<Number>::value,
// RETURN REAL
std::uniform_real_distribution<Number>, void>>>
Number random(Number min, Number max)
{
static std::random_device rd;
static std::mt19937 mt(rd());
Distribution dist(min, max);
return dist(mt);
}
, как вы можете видеть, что это решает во время компиляции, что тип распределения я хочу в зависимости от условий/типов прошли.
Очевидно, это может стать настоящим уродливым, если я попытаюсь добавить дополнительные условия, представьте, что я хочу 10 из них.
так я пытался построить один, но с треском провалился:
template<bool B, typename T>
struct cond
{
static constexpr bool value = B;
using type = T;
};
template<typename Head, typename... Tail>
struct select
{
using type = std::conditional_t<Head::value, typename Head::type, select<Tail...>>;
};
template<typename Head>
struct select<Head>
{
using type = std::conditional_t<Head::value, typename Head::type, void>;
};
template<typename Head, typename... Tail>
using select_t = typename select<Head, Tail...>::type;
причиной я попытался сделать конд структура, так что я могу получить «пары» из условий/типов, так что я могу получить любое количество из тех, кто использует шаблоны переменного числа, но это делает его еще более уродливой (не работает):
using Type = std::select_t<cond<false, void>,
cond<false, int>,
cond<true, std::string>>;
не только это не выглядит так хорошо, как я хочу, окончательный вариант будет, но это не делает даже Работа! он работает только при первом условии.
Есть ли что-нибудь, что не хватает? также как я могу достичь этого более чистым способом (по крайней мере для конечного пользователя).
благодарит заранее.
Что делать, если ни одно из условий не является истинным? – jrok
, если они не верны, он просто возвращает void. очевидно, оптимальным решением было бы просто не скомпилировать, если нет истинного условия. в зависимости от того, что делает конечный пользователь, void (почти) всегда сделает компиляцию неудачной, но она может как-то скомпилироваться и сделать ошибку в коде, не знаю, как решить эту проблему тоже. – sap