Проверка подписи функции с помощью C ++ 11 is_same? - PullRequest
4 голосов
/ 19 апреля 2019
//test.cpp
#include <type_traits>

double* func() {}

static_assert(std::is_same<double*(*)(), decltype(func)>::value, "");

int main() {}

Команда компиляции:

g++ -std=c++11 -c test.cpp

Вывод:

test4.cpp:6:1: error: static assertion failed:
static_assert(std::is_same<double*(*)(), decltype(func)>::value, "");
^

Что не так с кодом выше?Как я могу это исправить?

1 Ответ

5 голосов
/ 19 апреля 2019

func - это функция, и вы проверяете, является ли она указателем на функцию, она не работает

См .:

//test.cpp
#include <type_traits>
#include <iostream>

double d {};
double* func() { return &d ; }
auto ptr = func;

static_assert(std::is_same<double*(), decltype(func)>::value, "");
static_assert(std::is_same<double*(*)(), decltype(ptr)>::value, "");
static_assert(std::is_same<double*(*)(), decltype(&func)>::value, "");

double* call_func(double*(f)() )
{
    std::cout << __PRETTY_FUNCTION__ << std::endl;
    return f();
}

int main() {
    call_func(func); // double* call_func(double* (*)())
}

Я не эксперт по указателю на функцию, что я понимаю:

double* func() { return &d ; } // is a function 
auto ptr = func; // ptr is a pointer to a function

Может быть, вы можете видеть это как

1; // is a int
int i = 1; // i is a Lvalue expression 

Этот поток может быть полезен: Указатель на функцию и справочник по функции

И более официальная ссылка: https://en.cppreference.com/w/cpp/language/pointer#Pointers_to_functions (спасибо super )

...