Почему однажды обернуть подпись функции typedef не совпадает с оригинальной подписью - PullRequest
2 голосов
/ 06 ноября 2019

Почему этот код печатает 1, а затем 0?

typedef void (* GLFWkeyfun)(GLFWwindow*,int,int,int,int);
std::cout << std::is_same<GLFWkeyfun, void(*)(GLFWwindow*, int, int, int, int)>::value << std::endl;
std::cout << std::is_same<std::function<GLFWkeyfun>, std::function<void(GLFWwindow*, int, int, int, int)>>::value << std::endl;

1 Ответ

4 голосов
/ 06 ноября 2019

Обратите внимание, что GLFWkeyfun является функцией указатель типа. Вместо этого тип функции указывается в качестве аргумента шаблона std::function в std::function<void(GLFWwindow*, int, int, int, int)>.

. Мы должны указать тип функции std::function. Вы можете применить std::remove_pointer к GLFWkeyfun, например

std::cout << std::is_same<std::function<std::remove_pointer_t<GLFWkeyfun>>,
//                                      ^^^^^^^^^^^^^^^^^^^^^^          ^ 
                          std::function<void(GLFWwindow*, int, int, int, int)>>::value
          << std::endl;

Если ваш компилятор не поддерживает C ++ 14, тогда

std::cout << std::is_same<std::function<std::remove_pointer<GLFWkeyfun>::type>,
//                                      ^^^^^^^^^^^^^^^^^^^^          ^^^^^^^
                          std::function<void(GLFWwindow*, int, int, int, int)>>::value
          << std::endl;

Демо

...