小编Mr.*_*bis的帖子

C++模板中的一些混淆

我现在正在阅读本书,C++模板:完整指南.在一段时间我被卡住无法理解术语,这里是段落:

一个基本原则是任何模板参数必须是可以在编译时确定的数量或值.如后所述,此要求转化为模板实体的运行时成本的显着优势.因为模板参数最终被编译时值替换,所以它们本身可以用于形成编译时表达式.这在ArrayInClass模板中被利用来调整成员数组数组的大小.数组的大小必须是所谓的常量表达式,模板参数N必须符合这一要求.

我们可以进一步推动这种推理:因为模板参数是编译时实体,所以它们也可以用于创建有效的模板参数.这是一个例子:

template <typename T> 
class Dozen { 
  public: 
    ArrayInClass<T,12> contents; 
};
Run Code Online (Sandbox Code Playgroud)

请注意,在此示例中,名称T既是模板参数又是模板参数.因此,有一种机制可以从更简单的模板构建更复杂的模板.当然,这与允许我们组装类型和功能的机制没有根本的区别.

我无法理解任何事情.我很欣赏任何有关简单和理解单词的帮助.

编辑:

Arrayinclass:

template <typename T, int N> 
class ArrayInClass { 
  public: 
    T array[N]; 
};
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

序列点和运算符优先级之间的差异?0_o

让我举一个例子:

a = ++a;

据说上面的陈述有不明确的行为(我已经在SO上读过关于UB的文章)

但是根据优先级规则,运算符前缀的++优先级高于赋值运算符=

所以a应先增加,然后再分配给a.所以每个评估都是已知的,为什么它是UB?

c++

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

关于异常处理的一些问题

请看一下演示代码:

class myError
{
    const char* str;
public:
    myError():str(NULL) {}
    myError(const char* temp)
    {
        str = temp;
    }
    const char* what()
    {
        return str;
    }
};

class ab
{
    int x;
public:
    ab() try :x(0)
    {

            throw myError("error occured in the constructor of class ab");
    }
    catch(myError& temp)
    {
        std::cout<<"Handler no. 1 of ab constructor"<<std::endl;
    }
};

int main () try
{
    ab bb;
    cout << "Resumed execution!" << endl;
    return 0;
}
catch(myError& temp)
{
    std::cout<<"Handler below the main …
Run Code Online (Sandbox Code Playgroud)

c++ exception-handling

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

问题实例化结构模板

如何实例化这个模板结构?

template<typename T,
  template<typename, template <typename> class D= std::allocator
           >class Z=std::vector
         >

struct amen
{
    Z<T,D<T> > cc; // i know D template class parameter is not visible , how do i do it?
};

int main(){
amen<int> moreAmen;
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我怎么做?

c++ templates

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

Variadic模板之谜

这是可行的代码:

template<typename... Args> struct count;

template<>
struct count<> {
static const int value = 0;
};

template<typename T, typename... Args>
struct count<T, Args...> {
static const int value = 1 + count<Args...>::value;
};
Run Code Online (Sandbox Code Playgroud)

现在我想知道为什么我们需要部分专门化计数类模板?

我们可以这样做:

template< typename... args> struct dd; // edited according to answer but now getting error redeclared with 2 template parameters which is point below with mark %%

template<>
struct dd<>{
static const int value = 0;
};

template<typename T, typename... args> //%%
struct dd{
static const …
Run Code Online (Sandbox Code Playgroud)

c++ variadic-templates c++11

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

迷宫表示帮助

我想用图形创建迷宫,但我不知道从哪里开始.我只知道表示使用数组或图形数组的迷宫的方法.

  1. 在Array of Array表示中,是用于生成迷宫的递归回溯吗?
  2. 如果我选择使用基于图形的结构来生成迷宫,那么如何映射表示路径的边?我的意思是如何创建由图表的结束节点表示的墙?

c++ maze

2
推荐指数
1
解决办法
1309
查看次数

为BinaryTree类创建迭代器的算法

我想在我的Parametrized BinaryTree类中添加Bi-Directional Iterator(就像std :: set导出的Iterator),但是我无法想出任何算法.

简单的二叉树节点结构是,它包含三个指针,左,右,父:

节点结构

c++ binary-tree iterator data-structures

2
推荐指数
1
解决办法
1165
查看次数

虚拟内存系统,页表和TLB

我正在敲打头来解决这个问题,甚至无法前进一步,问题是:

考虑以下C程序:

int X[N];
int i;
int step = M; // M is some predefined constant
for (i = 0; i < N; i += step) X[i] = X[i] + 1;
Run Code Online (Sandbox Code Playgroud)

如果此程序在具有4 KB页面大小和64项TLB的计算机上运行,​​那么M和N的哪些值将导致每次执行内循环时TLB未命中?

任何人都可以给我一些提示我该如何解决?

c caching memory-management virtual-memory tlb

2
推荐指数
1
解决办法
7043
查看次数

虚函数在继承中表现得很奇怪?

Lemme通过给出一个例子来解释我的问题:

#include <iostream>

class PC
{
public:
    PC():Data(0)
    {
    }
    virtual void display()
    {
        std::cout<<"The data is :"<<Data<<std::endl;
    }
protected:
    int Data;
};

class SmartPC:private PC
{
public:
    SmartPC():PC()
    {
    }
    void convert()
    {
        PC* temp=static_cast<PC*>(this);
        temp->display();
    }
    void display()
    {
        std::cout<<"The data is (in bb):"<<a<<std::endl;
    }
};

int main()
{
    SmartPC SmrtPC;
    PC* miniPC= static_cast<PC*>(&SmrtPC);
    SmrtPC.convert();
}
Run Code Online (Sandbox Code Playgroud)

根据Scott Meyers的说法:static_cast<PC*>(this);将创建SmartPC的临时基础副本.但是temp->display();执行了display()派生类的功能.为什么会这样?它不应该执行base的功能display(),因为该对象现在完全是SmartPC基础的副本吗?

另一个问题是,如果我temp->data;convert()函数中添加行,它说 PC::Data是受保护但我从派生类范围访问它SmartPC,那么为什么它不起作用?

任何帮助表示赞赏.

c++ inheritance

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

关于EOF和EOL的问题

我试图了解 EOF 和 EOL,以及 C++ iostream 的实际工作原理。

在将输入通过getchar()或输入getche()char变量中时,我发现如果我写这样的行:

char a;
a =  getche();  // it returns char '\r' if pressed enter
a =  getchar(); // it returns char '\n' if pressed enter
Run Code Online (Sandbox Code Playgroud)

为什么是这些值?

  1. 实际上是什么让 C++ 认为我们已经用完了输入(即是否总是'\n'让 C++ 认为它在其输入的末尾?)。

  2. 在读/写一个以字符串结尾的文件时,'\n' 如果行以NULL字符结尾会发生什么,这也代表行尾?

你能用例子简要解释所有这些吗?

c++ windows stdio

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

C++ iostreams的很好的参考?

我正在努力理解C++ iostream库 - >"仅为什么和为什么".我在IBM找到了一个名为"IBM C/C++ Legacy Class Libraries Reference"的库,可以在这里看到:

IBM C/C++旧版类库参考 备用链接

我想问一下,这是c ++ 98 iostream的好参考(它符合标准吗?)?或任何其他参考?.我正在寻找深入和良好的教程,为什么会发生等等.

我不能买c ++ iostream和locales book(口袋问题:)),所以不要告诉我买它.

c++ iostream

0
推荐指数
2
解决办法
3882
查看次数