У меня есть две почти одинаковые функции (за исключением того, что одна из них является шаблоном):
int* bar(const std::variant<int*, std::tuple<float, double>>& t)
{
return std::get<0>(t);
}
template <typename... Args>
int* foo(const std::variant<int*, std::tuple<Args...>>& t)
{
return std::get<0>(t);
}
Чем они используются так:
foo(nullptr);
bar(nullptr);
Второй компилирует и возвращает (int*)nullptr
, но первый - нет (в Visual Studio 2019 с использованием C ++ 17 выдается ошибка foo: no matching overload found
). Зачем? Почему превращение этой функции в шаблон приводит к тому, что она перестает компилироваться?
Использование foo
, как показано ниже, также не помогает, поэтому невозможность вывести Args
, вероятно, не является проблемой:
foo<>(nullptr);
И наоборот, работает следующее:
foo(std::variant<int*, std::tuple<>>(nullptr));
Можно ли как-то избежать необходимости писать это так долго?