Я хочу иметь структуру, которая принимает произвольное количество лямбд и служит центральной точкой вызова для всех их операторов вызова.
Если оператор вызова вызывается со списком аргументов, который не соответствует ни одной из лямбд, заданных в конструкции, должен вызываться оператор вызова по умолчанию.
Я думал, что следующий код достигнет именно этого. Оператор вызова для каждой лямбды «поднимается» в класс Poc
через using
.
template <typename ...Lambdas>
struct Poc : Lambdas...
{
using Lambdas::operator() ...; // Lift the lambda operators into the class
template <typename ...Ts>
auto operator() (Ts...)
{
std::cout << "general call" << std::endl;
}
};
// Deduction guide
template <typename ...Ts>
Poc(Ts... ts)->Poc<Ts...>;
int main()
{
auto l_int = [](int) {std::cout << "int" << std::endl; };
Poc poc{l_int};
poc(1);//calls the default operator. why?
return 0;
}
Когда в структуре нет оператора вызова по умолчанию, все работает как положено (с действительными списками аргументов). Если я добавлю его в структуру (как в коде выше), оператор по умолчанию будет вызываться каждый раз, независимо от того, с какими аргументами я его вызываю.
В моем понимании лямбда-операторы вызова и операторы вызова структуры (по умолчанию) присутствуют в одной и той же области видимости. Следовательно, все они должны рассматриваться для разрешения перегрузки. Поскольку оператор lamdba более специфичен, чем общий оператор по умолчанию, его следует выбрать.
Видимо, это не так. Почему это?
Я тестировал на Microsoft Visual C ++ , Clang и GCC (все в их последних версиях).
Edit: