我现在正在阅读本书,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) 让我举一个例子:
a = ++a;
据说上面的陈述有不明确的行为(我已经在SO上读过关于UB的文章)
但是根据优先级规则,运算符前缀的++优先级高于赋值运算符=
所以a应先增加,然后再分配给a.所以每个评估都是已知的,为什么它是UB?
请看一下演示代码:
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) 如何实例化这个模板结构?
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)
谁能告诉我怎么做?
这是可行的代码:
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) 我想用图形创建迷宫,但我不知道从哪里开始.我只知道表示使用数组或图形数组的迷宫的方法.
我想在我的Parametrized BinaryTree类中添加Bi-Directional Iterator(就像std :: set导出的Iterator),但是我无法想出任何算法.
简单的二叉树节点结构是,它包含三个指针,左,右,父:

我正在敲打头来解决这个问题,甚至无法前进一步,问题是:
考虑以下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未命中?
任何人都可以给我一些提示我该如何解决?
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,那么为什么它不起作用?
任何帮助表示赞赏.
我试图了解 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)
为什么是这些值?
实际上是什么让 C++ 认为我们已经用完了输入(即是否总是'\n'让 C++ 认为它在其输入的末尾?)。
在读/写一个以字符串结尾的文件时,'\n' 如果行以NULL字符结尾会发生什么,这也代表行尾?
你能用例子简要解释所有这些吗?
我正在努力理解C++ iostream库 - >"仅为什么和为什么".我在IBM找到了一个名为"IBM C/C++ Legacy Class Libraries Reference"的库,可以在这里看到:
我想问一下,这是c ++ 98 iostream的好参考(它符合标准吗?)?或任何其他参考?.我正在寻找深入和良好的教程,为什么会发生等等.
我不能买c ++ iostream和locales book(口袋问题:)),所以不要告诉我买它.