В C ++, если я попытаюсь сделать это:
std::function<void(bool,void)>
, компилятор выдаст ошибки.Почему это?Это полезно во многих случаях.Один пример:
//g++ -std=c++17 prblm.cpp
#include <cstdio>
#include <functional>
template<class type_t>
class some_callback
{
public:
using callback_t = std::function<void(bool,type_t)>;
some_callback(callback_t _myfunc)
{
this->myfunc = _myfunc;
}
callback_t myfunc;
};
using callback_with_just_bool = some_callback<void>;
using callback_with_an_int_too = some_callback<int>;
int main()
{
auto my_callback_with_int = callback_with_an_int_too([](bool x, int y)
{
}); //OK
auto my_callback_just_bool = callback_with_just_bool([](bool x)
{
}); //Error
auto my_callback_just_bool = callback_with_just_bool([](bool x,void z)
{
}); //Error
return 0;
}
Это позволяет использовать очень чистый синтаксис, если пользователь желает иметь дополнительные данные в своем обратном вызове, но не обязан.Однако компилятор отклонит код, который пытается инициализировать объект callback_with_just_bool
. Почему это так, и есть ли чистый способ обойти это?Спасибо.
Редактировать: Конкретная причина, по которой я пытаюсь сделать это в реальном коде, заключается в системе событий.В систему событий поступают данные об отдельном объекте, который желает условно получать события (например, «если вы достаточно близки к источнику, вы получите звуковое событие»), а также данныепредоставил обратному вызову о событии (например, «шум 10 кГц при X200 Y200»).В большинстве случаев данные, необходимые для проверки требований, будут существовать внутри данных, предоставляемых для обратного вызова о событии, но я хотел предоставить дополнительную дополнительную структуру данных, если это не так.Следовательно, пользователь может указать «void», если ему не нужна эта дополнительная структура данных.