тип шаблона != вывести тип


Я пытаюсь дать понятное имя типа в качестве имени шаблона, потому что мне нужно использовать имя в нескольких местах внутри функции. Типа осуществляется на основании ряда других аргументов шаблона в пакете параметр, как показано ниже:

#include <cassert>#include <functional>#include <type_traits>template < typename ... TArgs, typename Functor = std::function< std::conditional_t< sizeof...(TArgs) == 0, int (), int (TArgs...) > > >void DoStuff(const Functor & func, TArgs ... args) {    if constexpr (sizeof...(TArgs) == 0)        assert(typeid(Functor).hash_code() == typeid(std::function<int ()>).hash_code());    else        assert(typeid(Functor).hash_code() == typeid(std::function<int (TArgs...)>).hash_code());}int main(int argc, char * argv[]) {    DoStuff([] () { return 5; });    DoStuff([] (int a) { return a; });    return 0;}
Functorstd::function<>Functortypeid

Это компилируется просто замечательно, но оба утверждения не потому, что псевдоним не является на самом деле . С другой стороны, если я изменить код, чтобы повторить определение на звонки она прекрасно работает, как показано ниже:

#include <cassert>#include <functional>#include <type_traits>template < typename ... TArgs, typename Functor = std::function< std::conditional_t< sizeof...(TArgs) == 0, int (), int (TArgs...) > > >void DoStuff(const Functor & func, TArgs ... args) {    if constexpr (sizeof...(TArgs) == 0)        assert(typeid(std::function< std::conditional_t< sizeof...(TArgs) == 0, int (), int (TArgs...) > >).hash_code() == typeid(std::function<int ()>).hash_code());    else        assert(typeid(std::function< std::conditional_t< sizeof...(TArgs) == 0, int (), int (TArgs...) > >).hash_code() == typeid(std::function<int (TArgs...)>).hash_code());}int main(int argc, char * argv[]) {    DoStuff([] () { return 5; });    DoStuff([] (int a) { return a; });    return 0;}
typname Functor = ...constexprtypeid

Почему первая декларация (использование ) неправильные? Есть ли другой способ, чтобы сделать это псевдоним? Обратите внимание, что в ответе на второй вопрос, это нормально, если решение является выражением const, то примеры не только из-за использования .