如何将模板别名设为模板 class

how to make template alias as template class

我试过模板,模板的语法class对我来说很有魅力, 我当时就想到了怎么练不好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" 关键字上工作吗?
为什么 "In substitution of template" void 不能应用于 U...

您的解决方案非常好。这是

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];

要有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;