В следующем коде:троичный оператор с станд :: index_sequence
#include <iostream>
#include <utility>
#include <set>
template <typename... Args>
void f(Args... args) {
std::cout << sizeof...(Args) << " elements.\n";
}
template <std::size_t... Is>
void g (std::index_sequence<Is...>, const std::set<int>& set) {
f((set.find(Is) == set.end() ? Is : 2*Is)...);
}
int main() {
g (std::make_index_sequence<10>{}, {1,3,7,8});
}
Я хочу f((set.find(Is) == set.end() ? Is : 2*Is)...);
использовать Is
если set.find(Is) == set.end()
но НИЧЕГО в противном случае (вместо 2*Is
). Таким образом, количество переданных аргументов не является фиксированным. Как это сделать?
Редактировать: Извините, но я слишком упростил проблему. Приведенный ниже код отражает более истинную проблему:
#include <iostream>
#include <utility>
#include <tuple>
template <typename... Args>
void f(Args... args) {
std::cout << sizeof...(Args) << " elements.\n";
}
struct NullObject {};
template <typename Tuple, std::size_t... Is>
void g (std::index_sequence<Is...>, const Tuple& tuple) {
f ((std::get<Is>(tuple) != std::get<Is+1>(tuple) ? std::get<Is>(tuple) : NullObject{})...);
}
int main() {
g (std::make_index_sequence<8>{}, std::make_tuple(2,1.5,'a','a',true,5,5,false));
}
выше не компилируется из-за смешанными типами, принятых тройным оператором, но я думаю, что вы можете увидеть мою идею здесь. Я хочу передать NOTHING, если условие std::get<Is>(tuple) != std::get<Is+1>(tuple)
, поэтому вместо этого передаю NullObject{}
, а затем как-то попытаюсь удалить все NullObjects из аргументов f
, чтобы получить истинные аргументы, переданные в f
.
Вы не можете, а не с выражением * trernary *. Почему бы не использовать оператор 'if'? Или вызовите функцию 'f' в тернарном выражении вместо использования тернарного выражения в вызове' f'. –
Если вы можете заменить содержимое 'std :: set' по типу компиляции, вы можете сделать что-то вроде: [Demo] (https://ideone.com/ZBF92c) – Jarod42
@ Jarod42 Извините, но я слишком упростил проблему, и я обновил вопрос. Я не уверен, что ваша техника все еще применяется или нет. – prestokeys