Aroch
> Ты меняешь тип и ожидаешь что плюсы вдруг станут не строго типизированным языком.
В С++ есть автоматическое приведение типов. Например, туда, где требуется std::string, можно подставить просто строковой литерал - и при вызове автоматически будет вызван конструктор string из const char* (при этом сам строковой литерал имеет тип не string и даже не const char* , а const char[SIZE]).
То есть, типы подставляемых аргументов не обязаны точно соответствовать сигнатуре, и это несоответствие может вылезать в обсуждаемом выше вариадик-шаблоне.
Dmitry_Milk
> есть автоматическое приведение типов
его должен кто-то написать. Ты собрался для всех пользовательских типов их прописывать если уж зашла речь про winapi'шные функции?
> Мне надо, чтоб выводился от сигнатуры указателя, переданного параметром шаблона, а он выводится из типов значений, которые подставили в качестве аргументов - #145.
у тебя в параметр шаблона не передается никакой указатель. Параметр шаблона не оперирует значениями кроме чисел и строк, все остальное типы. Сигнатура функции это тоже тип. Если ты хочешь из нее получить типы аргументов, то придется написать еще вспомогательных шаблонов.
Dmitry_Milk
> Мне надо, чтоб выводился от сигнатуры указателя, переданного параметром шаблона
ЫЫ предлагает такой вариант, вроде работает:
template<typename F, typename = void> struct function_traits; template<typename R, typename ... A> struct function_traits<R(*)( A...)> { using return_type = R; using args_type = std::tuple<A...>; template<std::size_t N> using arg = std::tuple_element_t<N, args_type>; }; template<auto F> struct Test // Пример использования { typename function_traits<decltype( F)>::return_type val; };
Aroch
> у тебя в параметр шаблона не передается никакой указатель
??? А что у меня туда передается, когда я делаю, например, так
myinvoke<CreateFileA>(аргументы)
?
Aroch
> Параметр шаблона не оперирует значениями кроме чисел и строк, все остальное типы.
Помимо чисел и строк non-type параметрами шаблонов могут быть и указатели, в том числе и указатели на функции, главное, чтоб адрес был известен в компайлтайме. Это можно наверное даже и в С++11, а уж в современных версиях С++ (вроде бы начиная с С++ 20) там еще всякого добавилось:
https://en.cppreference.com/w/cpp/language/template_parameters.html - посмотри, что там можно в Constant template parameter
}:+()___ [Smile], мда, мудрено накручено...
Dmitry_Milk
> https://en.cpprefere… rameters.html - посмотри, что там можно в Constant template parameter
посмотри, везде слово type.
> ??? А что у меня туда передается, когда я делаю, например, так
а ты думаешь что? Значение указателя на функцию? :) Что передается уже выше писал.
Aroch
> посмотри, везде слово type
Да, и это не слово typename. Про типы говорится во второй части Type template parameter, а в первой части, в Constant template parameter рассказывается именно про non-type, то есть, например, про int x, double y, char name[SIZE] и в том числе и, например, про void (*func_pointer)().
Dmitry_Milk
> в Constant template parameter рассказывается именно про non-type
это особенность терминологии, когда они решили константные параметры таким образом выделить. Это всё ещё не значения.
И кстати в 26 стандарте они таки изменили это терминологию и теперь их так и называют, константные параметры.
Aroch
> Это всё ещё не значения
Их можно использовать в выражениях, как в компайлтайме, так и в рантайме - использовать арифметику над числами, брать/сравнивать символы из строк и массивов, разадресовывать указатели и вызывать функции по указателям.
Dmitry_Milk
> разадресовывать указатели и вызывать функции по указателям.
речь про то что у тебя в auto, а не то что поcле auto. Компилятор сигнатуру твоей функции берет откуда по твоему? Из адреса?
Aroch
> Компилятор сигнатуру твоей функции берет откуда по твоему? Из адреса?
Нет конечно, компилятор эту сигнатуру сам знает в том месте, где конкретной функцией инстанциируется шаблон - в том месте сигнатура функции должна быть компилятору известна. Соответственно, шаблон инстанциируется как конкретной сигнатурой, так и конкретным адресом функции.
Dmitry_Milk
ну и какая сигнатура для перегруженной функции?
Aroch, та, которую укажешь явным приведением типа в месте инстанциирования. Зачем ты снова возвращаешься к перегруженным функциям? Мой вопрос был не про перегруженные функции, а про про то, чтоб пакет типов выводился из сигнатуры обычной функции. Если она обычная, не перегруженная - это возможно, и как конкретно - вот выше показал Смайл.
Dmitry_Milk
> чтоб пакет типов выводился из сигнатуры обычной функции.
по мне это является миной замедленного действия. В частных случаях ты сам можешь привести к нужному типу при вызове.
Dmitry_Milk
> Можно, конечно сделать так
Можно из буханки сделать троллейбус ;) Какой смысл в этой конструкции, если вместо нее всегда можно напрямую вызвать pointer с соответствующим набором параметров?
Не, ну если цель обфусцировать код или выстрелить бывшим коллегам в ногу напоследок, то идея хорошая, базара нет.