Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将模板别名设置为模板类_C++_Templates_Function Pointers_Using - Fatal编程技术网

C++ 如何将模板别名设置为模板类

C++ 如何将模板别名设置为模板类,c++,templates,function-pointers,using,C++,Templates,Function Pointers,Using,我试过模板,模板类的语法对我很有吸引力, 当时我能想到如何糟糕地练习std::function 但是。。。函数指针怎么样? 似乎应该将它们格式化为可管理的模板类型, 哪个更好,因为函数指针通常只能是间接声明 fptr数组_的_main[42] 所以我尝试了下面的方法: template<class T,class... U> using fptr<T(U...)>=auto (*)(U...)->T; 模板 使用fptr=自动(*)(U…)->T; 它失败了,似

我试过模板,模板类的语法对我很有吸引力, 当时我能想到如何糟糕地练习std::function

但是。。。函数指针怎么样?
似乎应该将它们格式化为可管理的模板类型,
哪个更好,因为函数指针通常只能是间接声明

fptr数组_的_main[42]

所以我尝试了下面的方法:

template<class T,class... U>
using fptr<T(U...)>=auto (*)(U...)->T;
模板
使用fptr=自动(*)(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=自动(*)(U…)->T;
auto main()->int
{
fptra[7];
fptrb[7];
}
嗯,不好,我仍然不能声明fptr哪个参数是空的。 前attampt向我们展示了专业化在这方面并没有真正起作用

那么,如何使
fptr
fptr
成为可能呢?
模板专门化可以在“使用”关键字上工作吗?

为什么“替换模板”void不能应用于
U.

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

fptr<int,void>
fptr<void,void>
fptr
fptr
这是错误的。如果希望指针指向不带参数的函数,请执行以下操作:

fptr<int>
fptr<void>
fptr
fptr

我是否可以建议仅使用标准库的替代方法:

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];
std::添加指针[7];
std::add_pointer_t b[7];
std::add_pointer_t c[7];
std::add_pointer_t 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];
std::type_identity_t a[7];
std::type_identity_t b[7];
std::type_identity_t c[7];
std::type_identity_t d[7];
要有
fptr
语法,实际上,您只需添加指针

template <typename Sig>
using fptr = Sig*;
模板
使用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;
模板结构fptr\u助手;
模板结构fptr\u助手
{
使用type=Ret(*)(Args…);
};
//C-省略格作为printf
模板结构fptr\u助手
{
使用type=Ret(*)(Args…,…);
};
使用fptr=typename fptr_helper::type的模板;