C++ 模板部分特化 模板 结构类型X; 模板 struct TypeX//此处,如果没有省略号,它将编译 { 静态std::字符串get_type() { 返回“int()”; } }; 模板 结构类型X { 静态std::字符串get_type() { 返回“int”; } }; 模板 结构类型描述符 { T型; typedef typename std::remove_reference::type no_ref_type; typedef typename std::remove_pointer::type no_ref_no_pointer_type; typedef typename std::remove_cv::type no_ref_no_pointer_no_cv_type; typedef typename std::remove_all_extent::type no_ref_no_pointer_no_cv_no_ext_type; typedef no_ref_no_pointer_no_cv_no_ext_type bare_type; 枚举{isArray=std::is_数组::value,isPointer=std::is_指针::value,isRef=std::is_引用::value}; 静态std::字符串get_type() { 返回指针\数组\类型X::get \类型(); } }; 模板 std::字符串数组 {返回“”;} 模板 std::字符串数组 {返回“数组”;} 模板 std::字符串指针 {返回“”;} 模板 std::字符串指针 {返回“指向”;} int _tmain(int argc,_TCHAR*argv[] { 库特

C++ 模板部分特化 模板 结构类型X; 模板 struct TypeX//此处,如果没有省略号,它将编译 { 静态std::字符串get_type() { 返回“int()”; } }; 模板 结构类型X { 静态std::字符串get_type() { 返回“int”; } }; 模板 结构类型描述符 { T型; typedef typename std::remove_reference::type no_ref_type; typedef typename std::remove_pointer::type no_ref_no_pointer_type; typedef typename std::remove_cv::type no_ref_no_pointer_no_cv_type; typedef typename std::remove_all_extent::type no_ref_no_pointer_no_cv_no_ext_type; typedef no_ref_no_pointer_no_cv_no_ext_type bare_type; 枚举{isArray=std::is_数组::value,isPointer=std::is_指针::value,isRef=std::is_引用::value}; 静态std::字符串get_type() { 返回指针\数组\类型X::get \类型(); } }; 模板 std::字符串数组 {返回“”;} 模板 std::字符串数组 {返回“数组”;} 模板 std::字符串指针 {返回“”;} 模板 std::字符串指针 {返回“指向”;} int _tmain(int argc,_TCHAR*argv[] { 库特,c++,metaprogramming,C++,Metaprogramming,问题是我为什么要专攻 对于省略号,它的意思是 任何数字我都会出错,但是 当我专攻无参数时 编译 因为省略号并不表示任何数量的括号(当您试图在main中使用它时)。省略号用于表示函数(C++03)中可变数量的参数 编辑:以下示例可能为您提供了足够的提示,以实现您想要的功能: template<class T> struct TypeX; template<> struct TypeX<int(...)>//HERE IF WITHOUT ELLIPSIS I

问题是我为什么要专攻 对于省略号,它的意思是 任何数字我都会出错,但是 当我专攻无参数时 编译

因为省略号并不表示任何数量的括号(当您试图在
main
中使用它时)。省略号用于表示函数(C++03)中可变数量的参数


编辑:以下示例可能为您提供了足够的提示,以实现您想要的功能:

template<class T>
struct TypeX;

template<>
struct TypeX<int(...)>//HERE IF WITHOUT ELLIPSIS IT WILL COMPILE
{
    static std::string get_type()
    {
        return "int()";
    }
};

template<>
struct TypeX<int>
{
    static std::string get_type()
    {
        return "int";
    }
};

template<class T>
struct type_descriptor
{
    typedef T type;
    typedef typename std::remove_reference<T>::type no_ref_type;
    typedef typename std::remove_pointer<no_ref_type>::type no_ref_no_pointer_type;
    typedef typename std::remove_cv<no_ref_no_pointer_type>::type no_ref_no_pointer_no_cv_type;
    typedef typename std::remove_all_extents<no_ref_no_pointer_no_cv_type>::type no_ref_no_pointer_no_cv_no_ext_type;
    typedef no_ref_no_pointer_no_cv_no_ext_type bare_type;

    enum {isArray = std::is_array<T>::value, isPointer = std::is_pointer<T>::value, isRef = std::is_reference<T>::value};

    static std::string get_type()
    {
        return pointer_<isPointer>() + array_<std::is_array<no_ref_no_pointer_type>::value>() + TypeX<bare_type>::get_type();

    }
};
template<bool C>
std::string array_()
{return "";}

template<>
std::string array_<true>()
{return "array of";}

template<bool C>
std::string pointer_()
{return "";}

template<>
std::string pointer_<true>()
{return "pointer to";}

int _tmain(int argc, _TCHAR* argv[])
{
    cout << type_descriptor<int(*)()>::get_type();

    return 0;
}
模板
结构类型X
{

TypeX(){cout省略号表示函数可以在每个调用位置接受任意数量的参数

TypeX
TypeX<T(*)()>
TypeX<T(*)(S)>
TypeX<T(*)(S)>
TypeX<T(*)(S, U)>
TypeX<T(*)(S, U)>
函数签名本身不同于每次调用(即
intf()
intf(int,double)
)所隐含的更具体的签名


因此,虽然您可以专门处理
int(*)(…)
情况,但只有实际指定初始省略号的函数类型才会匹配
不匹配。

我不明白,你能解释一下吗?大体上,我试图使用专门化:指向fnc的指针获取零args并返回int。@我们无能为力:实际上,专门化中不允许使用语法
。你必须这样做:……如果你有任何进一步的问题,请告诉我!@我们什么也做不了可以做的事情:我编辑了我的答案。请让我知道它对你有多大帮助…通过以下示例:
TypeX
TypeX<T(*)()>
TypeX<T(*)(S)>
TypeX<T(*)(S)>
TypeX<T(*)(S, U)>
TypeX<T(*)(S, U)>
int f(...);  // signature

int x = f();   // invocations
int y = f(my_int, my_double);