如何将模板别名设为模板 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;
我试过模板,模板的语法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;