Я столкнулся с проблемой при разрешении типа функции из std :: any.
Я в основном обертываю функцию и ее начальные аргументы в лямбда-функцию и вызываю ее позже, чтобы вызвать обернутую функцию, но с новым набором аргументов. Вот так выглядит упакованная функция.
void Hello(std::string str)
{
LOG(str);
}
И я пытаюсь выполнить лямбда-оболочку следующим образом: у меня есть лямбда-функция, которая либо выполняет упакованные функции, и / или иным образом просто возвращает упакованную функцию.
template<typename FuncName, typename... FuncArgs>
bool MMM(std::string EventName, FuncName&& EventFunction, FuncArgs&&... Args) noexcept
{
//Storing lambda here
auto fPtr = std::function<std::any(bool)>([=](bool x)
{
if(x){
EventFunction(Args...);
}
return (FuncName)EventFunction;
});
}
Теперь, когда я пытаюсь вызвать эту лямбу так:
template<typename E, typename FuncName, typename... FuncArgs>
bool AAA(E EventName, FuncName &&EventFunction, FuncArgs&&... Args)
{
try {
//resolving lambda and invoking it here
auto func = std::any_cast<decltype(EventFunction)>(fPtr)(false));
func(Args...);
} catch (...) {
std::cout<<"Didn't invoke function: Mismatch argument type.\n";
}
return true;
}
Я вызываю эту функцию следующими способами:
MMM(e, Hello, "Hello Florida");
MMM(e, Hello, "Hello USA");
AAA(e, Hello, "Hello World");
Проблема:
Когда вызывается функция AAA, я получаю исключение, которое говорит, что auto_cast не удалось разрешить тип функции.
Во время выполнения я вижу (fPtr) (false) возвращается:
std::__1::function<std::__1::any (bool)> Function = Hello(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)
в то время как кажется, что decltype (EventFunction) имеет тип
void (&)(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) 0x0000000100012540
Похоже, я почти близок к тому, что std :: any хранит внутри, но все еще не хватает чего-то, чего я не понимаю, что! Как я могу устранить это несоответствие std :: any_cast?