Что означает нотация указателя на функцию, создаваемая std::bind?

Рейтинг: 3Ответов: 1Опубликовано: 26.04.2023

Из отладчика вот такую строку не могу прочесть:

std::_Bind<void (SpeechRecognizerPlugin:: *(SpeechRecognizerPlugin *))()>::operator()<, void>()
  • void() - тип функции
  • SpeechRecognizerPlugin::* - указатель на член SpeechRecognizerPlugin

А вот это что такое?

  • (SpeechRecognizerPlugin::* (SpeechRecognizerPlugin*))

И почему параметр шаблона пропущен перед запятой? Как так?

Пример взят из call-stack'а дебаггера. Может быть это особая нотация самого дебаггера?

Ответы

▲ 2Принят

Это тип функции, принимающей указатель на SpeechRecognizerPlugin и возвращающей указатель на нестатическую функцию этого класса.

#include <type_traits>

struct SpeechRecognizerPlugin
{};

using VoidFun = void ();
using MemberVoidFunPtr = VoidFun SpeechRecognizerPlugin::*;
using Fancy = MemberVoidFunPtr (SpeechRecognizerPlugin *);

static_assert
(
    ::std::is_same_v
    <
        void (SpeechRecognizerPlugin:: *(SpeechRecognizerPlugin *))()
    ,   Fancy
    >
);

Online compiler

Параметры вида , void получаются, когда вначале идет пустой пак параметров.

template<typename... Args>
struct Dummy
{
    using Type = void;
};

struct Foo
{
    template<typename... Args, typename Last = typename Dummy<Args...>::Type>
    void operator ()(Args...)
    {}
};

int main()
{
    Foo foo{};
    foo();
}