Можем ли мы использовать «using» с именем пакета параметров?

Предположим, у нас есть следующий шаблон «перегруженные лямбды» для 2 версий (взято из здесь):

template <class F1, class F2>
struct overload_set : F1, F2
{
    overload_set(F1 x1, F2 x2) : F1(x1), F2(x2) {}
    using F1::operator();
    using F2::operator();
};

template <class F1, class F2>
overload_set<F1,F2> overload(F1 x1, F2 x2)
{
    return overload_set<F1,F2>(x1,x2);
} 

который мы можем использовать так:

auto f = overload (
    []( int) { cout << __PRETTY_FUNCTION__ << endl; }, 
    [](char) { cout << __PRETTY_FUNCTION__ << endl; }
);

f('k');
f( 2 );

Теперь вопрос в том, можем ли мы сделать общий подход к этому? Я пробовал со следующим (реализация с того же сайта):

template <class... F>
struct overload_set : F... 
{
  overload_set(F... f) : F(f)... {}  
};

template <class... F>
auto overload(F... f) 
{
  return overload_set<F...>(f...);   
}

но тогда я получаю:

main.cpp: In function ‘int main()’:
main.cpp:59:6: error: request for member ‘operator()’ is ambiguous
   f(1);
      ^
main.cpp:51:14: note: candidates are: main()::<lambda(char)>
       [](char) { cout << __FILE__ << ":" << __LINE__ << ":" << __PRETTY_FUNCTION__ << endl; });
              ^
main.cpp:50:13: note:                 main()::<lambda(int)>
       [](int) { cout << __FILE__ << ":" << __LINE__ << ":" << __PRETTY_FUNCTION__ << endl; },
             ^
main.cpp:60:8: error: request for member ‘operator()’ is ambiguous
   f('a');
        ^
main.cpp:51:14: note: candidates are: main()::<lambda(char)>
       [](char) { cout << __FILE__ << ":" << __LINE__ << ":" << __PRETTY_FUNCTION__ << endl; });
              ^
main.cpp:50:13: note:                 main()::<lambda(int)>
       [](int) { cout << __FILE__ << ":" << __LINE__ << ":" << __PRETTY_FUNCTION__ << endl; },

person Patryk    schedule 25.10.2015    source источник
comment
Вместо одного using F::operator()...; можно рекурсивно перенести эти операторы с наследованием   -  person Piotr Skotnicki    schedule 26.10.2015
comment
Хм. Этот другой вопрос касается примерно того же кода, вопрос о коде другой, но ответ работает и здесь. Я подозреваю, что было бы нормально закрыть это как дубликат. Если на какой-то аспект вашего вопроса нет адекватного ответа, можете ли вы отредактировать свой вопрос, чтобы расширить его? Или можно просто закрыть этот вопрос?   -  person    schedule 26.10.2015
comment
@hvd Да, ответ в связанном вопросе работает так, как я хотел. Мы можем закрыть это тогда.   -  person Patryk    schedule 26.10.2015
comment
@PiotrSkotnicki Ты прав. Давайте закроем этот.   -  person Patryk    schedule 26.10.2015
comment
Спасибо за подтверждение, готово.   -  person    schedule 26.10.2015
comment
@Patryk Обратите внимание, что связанный ответ обеспечивает линейное наследование. При использовании большого количества родителей (скажем, более нескольких сотен) вам действительно нужно наследование бинарного дерева, что сложнее. Если у вас нет такого риска, используйте линейное наследование.   -  person Yakk - Adam Nevraumont    schedule 26.10.2015