标签: class-template

C++ - 模板专业化和部分专业化

我一直在寻找互联网和stackoverflow的具体答案,但我似乎无法找到一个.我必须创建一个泛型类,然后实现特定的功能.我的具体说明是:您需要使用模板表达式参数和模板类专业化和部分专业化.

我有一个模板类:

template <class T, int x, int y>
class Z {
    T **array[x][y];
    public:
         Z();
         void print();
         //and other methods
};
Run Code Online (Sandbox Code Playgroud)

我需要:

1)只有Z的,其中x = 2和y = 2需要有一个公共方法void J()

2)对于x = 2且y = 2 J的char Z,它会做某事; 对于其他一切,它做了别的事

3)对于只有Z是char的字符,将数组初始化为某个值.其他一切都是0

当然,这有效:

template<class T, int x, int y>
Z<T,x,y>::Z<T,x,y>() { //initialize to 0 } 
Run Code Online (Sandbox Code Playgroud)

但这不是:

template<int x, int y>
Z<char,x,y>::Z<char,x,y>() { //initialize to something}
Run Code Online (Sandbox Code Playgroud)

同样(假设J存在)这不起作用:

template <class T>
void Z<T,2,2>::J() { //something }
Run Code Online (Sandbox Code Playgroud)

我的问题是:

有没有简单的方法来实现上述项目?我需要在Z中保留所有其他方法.给出一个提示或指向正确的方向(也许我错过了一个问题,因为有很多)会有所帮助.

谢谢.

c++ templates class-template

4
推荐指数
1
解决办法
1262
查看次数

为什么我不能使用QList :: size_type,因为我会使用std :: string :: size_type?(模板参数错误)

在我的for循环中声明迭代器时研究无符号与有符号整数比较警告时,我读到了这个:

尽可能使用您要比较的确切类型(例如,std::string::size_typestd::string长度比较时使用).

QList<T>想要迭代,使用上面的方法声明迭代器:

 for(QList::size_type i = 0; i < uploads.size(); i++)
 {
     //Do something
 }
Run Code Online (Sandbox Code Playgroud)

它给了我一个编译器错误:

error: 'template<class T> class QList' used without template parameters
for(QList::size_type i = 0; i < uploads.size(); i++)
Run Code Online (Sandbox Code Playgroud)

为什么我不能以同样的方式使用它?这是由我还是由Qt框架及其类型引起的?QList::size_type在这种情况下,什么是一个很好的替代品,QList::size()只需返回一个常规的旧的int,我想使用它; 但我读了上面链接的帖子,这让我不确定.

c++ qt templates dependent-name class-template

4
推荐指数
2
解决办法
157
查看次数

在“函数名称”操作符后面输入参数 &lt;T&gt;

以下两个片段有什么区别?

  1. 使用<T>for 运算符 <<
template<typename T>
class Stack {
...
friend std::ostream& operator<< <T> (std::ostream&,
Stack<T> const&);
};
Run Code Online (Sandbox Code Playgroud)
  1. 没有 <T>
template<typename T>
class Stack {
...
friend std::ostream& operator<< (std::ostream&,
Stack<T> const&);
};
Run Code Online (Sandbox Code Playgroud)

c++ class-template

4
推荐指数
1
解决办法
59
查看次数

类模板的构造函数声明不针对 C++20 进行编译,但针对 C++17 进行编译

我正在学习 C++ 中的模板。特别是,我在这里看到我们可以对构造函数进行以下声明:

template<typename T>
struct Rational
{
  Rational<T>();  
};
Run Code Online (Sandbox Code Playgroud)

但上面的代码片段在 C++2a 中编译失败,在 C++17 中编译成功。

这是编译器错误还是有原因导致它无法针对 C++2a 和 C++2b 进行编译。如果有原因的话,那是什么原因呢?我想知道标准中的哪些子句(如果有)允许/阻止以下示例进行编译。由于我已经使用 C++17 和 C++20 测试了上面的示例,因此我只寻找这两个标准版本的引用。

c++ language-lawyer class-template c++17 c++20

4
推荐指数
1
解决办法
609
查看次数

GCC 与 Clang 中的显式成员函数模板专业化错误

当我注意到一种这样的情况(如下所示)在 clang 和 msvc 中编译良好但在 gcc 中编译失败时,我试图显式地专门化一个成员函数模板。这是验证相同内容的链接:https ://godbolt.org/z/15z4nT5Kx

struct C 
{
    template<typename T> 
    void f()
    {
        
    }
    
    template<> void f<int>()
    {
        
    }
};

int main()
{   
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

从上面的链接中可以看出,clang 和 msvc 编译程序没有任何问题,但 gcc 说:

<source>:10:14: error: explicit specialization in non-namespace scope 'struct C'
   10 |     template<> void f<int>()
      |              ^
<source>:10:21: error: template-id 'f<int>' in declaration of primary template
   10 |     template<> void f<int>()
      |                     ^~~~~~
Run Code Online (Sandbox Code Playgroud)

这里是哪个编译器?

c++ language-lawyer class-template

4
推荐指数
1
解决办法
269
查看次数

对整型常量表达式强制执行编译时最大值

我有一个像这样的模板类:

template<typename T, unsigned int size>
class Array 
{
public:
  static const unsigned int SIZE = size;
  // ...
private:
  T data[SIZE];
};
Run Code Online (Sandbox Code Playgroud)

有没有办法添加编译时检查,使 an 的大小Array<T,XXXX>永远不会超过某个值?

就像如果该值为512,则不应编译:

Array<int, 1000> arr;


C++ 化我的代码的想法对我来说是新的,所以我愿意接受任何指南或在线进一步学习来帮助解决这个问题,因为我什至不知道要谷歌搜索什么。我尝试过的一切似乎都还很遥远。

c++ templates class-template c++17 compile-time-type-checking

4
推荐指数
1
解决办法
81
查看次数

从类对象访问模板参数

我在 myclass.hpp 中有一个类模板:

template<class T, class P>
class myclass
{
....
};
Run Code Online (Sandbox Code Playgroud)

在我的 main.cc 中,我创建了该类的一个对象:

myclass<int, double> mc;
otherfunc<myclass>(mc);
Run Code Online (Sandbox Code Playgroud)

在其他一些头文件header1.hpp中:

template<class MyClass>
void otherfunc(MyClass const &mc)
{
/* Access through 'mc' the underlying template parameters T and P*/
}
Run Code Online (Sandbox Code Playgroud)

如何访问 header1.hpp 中的模板参数 T 和 P?

c++ templates class-template

3
推荐指数
1
解决办法
4496
查看次数

对于类模板,std::enable_if 相对于 static_assert 的优势是什么?

我想知道std::enable_ifoverstatic_asserts防止模板实例化的优势。这个答案表明,这std::enable_if允许SFINAE,这在函数模板的情况下是一个令人信服的论点。

然而,这个论点对于类模板(和变量模板)是否合法?据我所知,那里不涉及重载决议,这使得 SFINAE - 再次,据我所知 - 不相关,但我可能是错的。如果是这样,你能举一个例子吗?

如果不是,我认为static_assert在类模板的情况下是给定问题(防止模板实例化)的更好解决方案,因为它可以说更明确、简洁和可读,并允许自定义错误消息。这是正确的还是我错过了 SFINAE 以外的一点?

c++ templates static-assert enable-if class-template

3
推荐指数
1
解决办法
193
查看次数

有一个声明 Stack&lt;T&gt;(); 对于类模板内有效的默认 ctor

我看到这个关于 SO 的问题的答案,该问题与类模板的默认构造函数的声明相关,该声明表示由于CWG1435,以下代码不是有效的 C++ :

template <class T> class Stack {
public:
  Stack<T>(); //IS THIS VALID?
};

Run Code Online (Sandbox Code Playgroud)

而另一个答案说上面的例子是有效的C++。有两个来源可以证明上述示例有效:

  1. 注入的类名

否则,它被视为类型名称,相当于模板名称后跟 <> 中包含的类模板的模板参数

  1. CppCon 会议上, Dan Saks基本上展示了一个非常相似的例子。

因此,正如我们所看到的,两个链接的答案提出了相反的主张,我不知道哪一个是正确的。所以我的问题是这两个答案哪个是正确的。也就是说,声明Stack<T>();是否有效 C++。

PS:我问的是 C++11 及以后的现代 C++ 含义。

c++ templates errata class-template

3
推荐指数
2
解决办法
173
查看次数

CTAD 可以在模板类的成员内部使用吗?

C++ 有一个有用的功能,即模板参数隐含在模板类内的代码中A。然而,对于建筑来说,这似乎与 CTAD 发生冲突。

如何让 CTAD 优先?

例如,在这里,成员中有一个错误f,因为A它被解释为A<T>where Tis std::string,而不是从参数 推导出来double

#include<string>

template<class T>
struct A {
    A(T const& t) {}
    auto f() {return A{5.0};}  // error here triggered by line 11 `auto a2 = a1.f();`
};

int main() {
    A a1{std::string{"hello"}};
    auto a2 = a1.f();
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/3nc7nev3o

c++ class-template c++20 ctad

3
推荐指数
1
解决办法
120
查看次数