У меня есть структура кода, где я беру указатель на перегруженную функцию, проверяю, какую перегрузку выполнить, static_cast
Указатель на правильную перегрузку и запускает ее.
Проблема в том, что функция вызывающейотвечает за принятие указателя на любую перегрузку для этой функции, не может знать список существующих перегрузок.Таким образом, такой код:
auto ptr = &foobar;
invoke_correct_overload<decltype(ptr)>(ptr);
Не может работать, потому что первая строка неоднозначна.Есть ли способ указать, что перегрузка не имеет значения в первой строке или что это должна быть первая перегрузка, найденная компилятором?
Context
У меня есть переменная номер std::variant
, и необходимо передать его различным функциям в зависимости от значения, которое они содержат.Я нашел способ с массивом constexpr, чтобы найти, какую перегрузку выполнить, и пишу функцию, которая берет указатель на функцию, приводит все варианты в соответствие с индексом в массиве и выполняет его.
Текущая попытка
#define GENERAL_INTERFACE(SPE_FUNC, OPERANDS) do {\
int valid_comb_index = evaluate_valid_types(valid_args_##SPE_FUNC, OPERANDS)); \
constexpr [[maybe_unused]] auto foo = SPE_FUNC; \
invoke_right_overload<valid_args_##SPE_FUNC.size(), \
valid_args_##SPE_FUNC[0].size() - 1, \
valid_args_##SPE_FUNC, decltype(foo)> \
(valid_comb_index, OPERANDS,foo); \
template<std::size_t N, std::size_t P,
const std::array<std::array<int, 1>, N>& valid_args, typename T>
void invoke_right_overload(int valid_comb_index,
std::vector<Operand> operands, T& funcptr) {
if(valid_comb_index == P - 1) {
auto to_invoke = static_cast<void(*)(decltype(std::get<valid_args[P][0]>(Operand())))>(funcptr);
std::invoke(to_invoke, std::get<valid_args[P][0]>(operands[0]));
}
if constexpr (P - 1 == 0) return;
invoke_right_overload<N, P - 1, valid_args, T>(valid_comb_index,
operands, funcptr, apply_to);
}
Проблема в функции, которую вызывает invoke_right_overload.Существует несколько «перегрузок» invoke_right_overload для 0, 1, 2 или 3 операндов, поэтому я не могу получить перегрузку, используя первую допустимую комбинацию, поскольку их может не быть.
Я знаю этовопрос не совсем правильно сформулирован, но не может найти какой-то конкретный момент, чтобы сделать его лучше.Я отредактирую вопрос так, как вам будет угодно для получения дополнительной информации.