как сделать псевдоним шаблона как шаблон класса - PullRequest
1 голос
/ 14 апреля 2020

Я пробовал шаблон, и синтаксис класса шаблона для меня очарователен, я мог бы подумать о том, как плохо практиковать std :: function в то время.

, но ... как насчет указателя на функцию ?
Кажется, следует форматировать их в управляемый тип шаблона,
, что лучше, поскольку указатель функции обычно может быть только косвенным объявлением.

fptr<int()> array_of_main[42];

, поэтому я попробовал кое-что ниже:

template<class T,class... U>
using fptr<T(U...)>=auto (*)(U...)->T;

происходит сбой, похоже, что компилятор не специализирует шаблоны на псевдонимах.
Еще один недостаток:

template<class T,class... U>
using fptr=auto (*)(U...)->T;

auto main()->int
{
    fptr<int,int> a[7];
    fptr<void,int> b[7];
}

ну, не хорошо, я все еще не могу объявить fptr какой параметр пуст. и прежняя неприязнь показала нам, что специализация на самом деле не работает над этим.

так, как сделать возможными fptr<int,void> и fptr<void,void>?
может ли специализация шаблона работать с ключевым словом "using"?
и почему «В замене шаблона» void не может применяться к U...?

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Чтобы иметь синтаксис fptr<int()>, на самом деле, вам просто нужно добавить указатель ...

template <typename Sig>
using fptr = Sig*;

Хотя ваша частичная специализация может быть выполнена для классов:

template <typename Sig> struct fptr_helper;

template <typename Ret, typename... Args> struct fptr_helper<Ret(Args...)>
{
    using type = Ret(*)(Args...);
};
// C-ellipsis case as printf
template <typename Ret, typename... Args> struct fptr_helper<Ret(Args..., ...)>
{
    using type = Ret(*)(Args..., ...);
};
template <typename Sig> using fptr = typename fptr_helper<Sig>::type;
0 голосов
/ 14 апреля 2020

Ваше решение в порядке. Это

fptr<int,void>
fptr<void,void>

Это неправильно. Если вы хотите, чтобы указатель функционировал без параметров, то сделайте следующее:

fptr<int>
fptr<void>

Могу ли я предложить альтернативный подход с использованием только стандартной библиотеки:

std::add_pointer_t<int(int)> a[7];
std::add_pointer_t<void(int)> b[7];
std::add_pointer_t<int()> c[7];
std::add_pointer_t<void()> d[7];

Или, поскольку C ++ 20:

std::type_identity_t<int (*) (int)> a[7];
std::type_identity_t<void (*) (int)> b[7];
std::type_identity_t<int (*) ()> c[7];
std::type_identity_t<void (*) ()> d[7];
...