Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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++ 我希望类模板只有在传递给模板的类型是int时才具有排序方法_C++ - Fatal编程技术网

C++ 我希望类模板只有在传递给模板的类型是int时才具有排序方法

C++ 我希望类模板只有在传递给模板的类型是int时才具有排序方法,c++,C++,首先,我知道这个问题已经得到了回答,但我真的不知道该怎么做 我正在创建我自己的vector类(出于学习目的),我希望它有一个排序方法,只有当传递给模板的类型是int时,我才对它进行编码 template<typename T> class vector { T* _arr = new T[5]{ 0 }; size_t _size = 0; public: template<> void sort<int>()

首先,我知道这个问题已经得到了回答,但我真的不知道该怎么做

我正在创建我自己的vector类(出于学习目的),我希望它有一个排序方法,只有当传递给模板的类型是int时,我才对它进行编码

template<typename T>
class vector
{
    T* _arr = new T[5]{ 0 };
    size_t _size = 0;
    
public:
    template<>
    void sort<int>()
    {
        // whatever
    }
};
模板
类向量
{
T*_arr=新的T[5]{0};
大小\u t\u大小=0;
公众:
模板
空排序()
{
//随便
}
};
看起来像那样吗?顺便说一句,我希望该方法在类中定义。
你会怎么做呢?

C++20有很好的
要求

template <typename T>
class vector
{
    T* _arr = new T[5]{ 0 };
    size_t _size = 0;
    
public:
    void sort() requires(std::is_same_v<T, int>)
    {
        // whatever
    }
};
模板
类向量
{
T*_arr=新的T[5]{0};
大小\u t\u大小=0;
公众:
void sort()需要(std::is_same_v)
{
//随便
}
};
对于以前的版本,您必须使用SFINAE

template <typename T>
class vector
{
    T* _arr = new T[5]{ 0 };
    size_t _size = 0;
    
public:
    template <typename Dep = T, std::enable_if_t<std::is_same_v<Dep, int>, int> = 0>
    void sort()
    {
        // whatever
    }
};
模板
类向量
{
T*_arr=新的T[5]{0};
大小\u t\u大小=0;
公众:
模板
空排序()
{
//随便
}
};
或专门化(您可能必须创建额外的CRTP类以将专门化限制为额外的方法):

模板类向量;
模板结构向量_分类器{};
模板
结构向量分类器
{
私人:
vector&self(){return static_cast(*this);}
公众:
空排序()
{
//随便
//使用'self()'而不是'this'来访问'vector'成员
//例如'self().\u arr','self().\u size`
}
};
模板
类向量:向量分类器
{
朋友向量机;
T*_arr=新的T[5]{0};
大小\u t\u大小=0;
公众:
// ...
};
#如果0//或专门化整个类
模板
类向量
{
int*_arr=新的int[5]{0};
大小\u t\u大小=0;
公众:
空排序()
{
//随便
}
};
#恩迪夫

C++20具有nice
要求的

template <typename T>
class vector
{
    T* _arr = new T[5]{ 0 };
    size_t _size = 0;
    
public:
    void sort() requires(std::is_same_v<T, int>)
    {
        // whatever
    }
};
模板
类向量
{
T*_arr=新的T[5]{0};
大小\u t\u大小=0;
公众:
void sort()需要(std::is_same_v)
{
//随便
}
};
对于以前的版本,您必须使用SFINAE

template <typename T>
class vector
{
    T* _arr = new T[5]{ 0 };
    size_t _size = 0;
    
public:
    template <typename Dep = T, std::enable_if_t<std::is_same_v<Dep, int>, int> = 0>
    void sort()
    {
        // whatever
    }
};
模板
类向量
{
T*_arr=新的T[5]{0};
大小\u t\u大小=0;
公众:
模板
空排序()
{
//随便
}
};
或专门化(您可能必须创建额外的CRTP类以将专门化限制为额外的方法):

模板类向量;
模板结构向量_分类器{};
模板
结构向量分类器
{
私人:
vector&self(){return static_cast(*this);}
公众:
空排序()
{
//随便
//使用'self()'而不是'this'来访问'vector'成员
//例如'self().\u arr','self().\u size`
}
};
模板
类向量:向量分类器
{
朋友向量机;
T*_arr=新的T[5]{0};
大小\u t\u大小=0;
公众:
// ...
};
#如果0//或专门化整个类
模板
类向量
{
int*_arr=新的int[5]{0};
大小\u t\u大小=0;
公众:
空排序()
{
//随便
}
};
#恩迪夫

如果向量类型T不是整数类型(例如std::string或类似类型),这里有一种禁用函数的方法

//使模板参数整数与类型T相同
//然后根据整型是否为整型启用此函数
模板
空排序()
{

std::cout如果向量类型T不是整数类型(例如std::string或诸如此类),这里有一种禁用函数的方法

//使模板参数整数与类型T相同
//然后根据整型是否为整型启用此函数
模板
空排序()
{

std::cout No,这是不正确的。你需要声明
sort()
,以使其在声明中使用,例如via。对不起,我的SFINAE功夫不是很好,所以我不能给你举个例子,但是有很多。不,这是不正确的。你需要声明
sort()< C++ >代码,比如说通过。抱歉,我的SIFEAN功夫不太好,所以我不能给你举个例子,但是有很多是浮动的。等等,我是在这里丢了…C++是20?AORAY??哦,你的好的“DAAAAAAAAMAN是C++ 20?”(因此以其名称命名为20)。名字中的数字是它发布的年份——2020年的C++20,2017年的C++17,2011年的C++11,2003年的C++03,1998年的C++98。@Remylebou ye,但我认为它会在今年年底发布。C++20在技术上是在2月份定稿的,然后在9月份将草案发送给投票批准,最终的出版物将是bE是在年底前制作的,它与C++ XY ISO标准最终发布的担心无关,但更担心C++是否已经完成,以及编译器是否支持支持你希望使用的C++ XY部分。等等,我在这里丢失了……C++ 20是不是?哦!“C++ 20是不是?”——是的,今年年初就完成了(因此它的名字中有20个)。名字中的数字是它发布的年份——2020年的C++20,2017年的C++17,2011年的C++11,2003年的C++03,1998年的C++98。@Remylebou ye,但我认为它会在今年年底发布。C++20在技术上是在2月份定稿的,然后在9月份将草案发送给投票批准,最终的出版物将是b与C++XY ISO标准最终发布无关,更重要的是担心C++XY是否已经定稿,以及您希望支持的编译器是否支持您希望使用的C++XY部分。