Предположим, у меня есть что-то вроде этого:Dummy аргументы в lambdas, которые будут соответствовать любому типу?
struct Foo {};
struct Bar {};
struct Baz {};
// ...
void RegisterListener1(std::function<void(Foo)>);
void RegisterListener2(std::function<void(Bar)>);
void RegisterListener3(std::function<void(Baz)>);
там, где нет никакой связи между Foo
, Bar
и Baz
.
Теперь предположим, что я хотел бы передать каждую из этих функций регистра идентичной лямбда, которую игнорирует свой аргумент. Есть ли что-нибудь, что я могу включить в список аргументов лямбды, который означает «что-нибудь здесь, я просто собираюсь выбросить эту вещь»?
auto listener = [](/* what? */) { throw UnsupportedOperationException(); };
RegisterListener1(listener);
RegisterListener2(listener);
RegisterListener3(listener);
Я мог бы использовать шаблон функции вместо лямбда и сделать что-то вроде этого:
template<typename T>
void listener(T)
{
throw UnsupportedOperationException();
}
// ...
RegisterListener1(listener<Foo>);
RegisterListener2(listener<Bar>);
RegisterListener3(listener<Baz>);
Но это утомительно, особенно если аргументы функторов в три регистра функций шаблонный себя таким образом, что есть нет простого способа выписать «внутренние» типы аргументов. Вот еще одна идея, которая пришла мне в голову в процессе печатаю это до:
struct Anything
{
template<typename T> Anything(const T&) {}
};
// ...
auto listener = [](Anything) { throw UnsupportedOperationException(); };
RegisterListener1(listener);
RegisterListener2(listener);
RegisterListener3(listener);
Я на самом деле в порядке с этим, и, возможно, мне не нужно больше, чтобы задать вопрос, но есть еще лучше вариант?
Если вы создаете структуру, вы можете также прорезать лямбду и просто использовать функтор. –