这个问题试图收集每年出版的数十本不良C++书籍中的少数珍珠.
与许多其他编程语言不同,这些编程语言经常从互联网上的教程中随处获取,很少有人能够快速学习C++,而无需学习编写精良的C++书籍.这样做太复杂了.事实上,它是如此庞大和复杂,有很多非常糟糕的C++书籍.我们并不是在谈论糟糕的风格,而是体育明显的事实错误和促进糟糕的编程风格.
请编辑接受的答案,以提供高质量的书籍和近似的技能水平 - 最好 在 C++聊天室讨论您的添加后.(如果他们不同意建议,常客可能会毫不留情地撤销你的工作.)添加一篇关于你亲自阅读/受益的每本书的简短描述/描述.随意讨论质量,标题等.符合标准的书籍将被添加到列表中.由C和C++用户协会(ACCU)撰写评论的图书都有指向评论的链接.
*注意:常见问题和其他资源可以在C++标签信息和c ++ - faq中找到.
在声明模板时,我习惯使用这种代码:
template <class T>
Run Code Online (Sandbox Code Playgroud)
但在这个问题中,他们使用了:
template <unsigned int N>
Run Code Online (Sandbox Code Playgroud)
我查看它编译.但是这是什么意思?它是非类型参数吗?如果是这样,我们怎么能有一个没有任何类型参数的模板?
有了std::is_constructible一个可以质疑一定构造的存在某个给定类型:
struct A {};
struct B
{
explicit B(int, A, double) {}
};
int main()
{
std::cout<<std::is_constructible<B,int,A,double>::value<<std::endl; //prints true
}
Run Code Online (Sandbox Code Playgroud)
假设一个人不知道类型B.是否还有一种方法可以检查是否存在B包含类型的构造函数A,而不管其他参数是什么?( - 或者,已经足够了,其中包含A第n个位置的类型?)
给定一个非explicit构造函数,我通过使用一个可以隐式转换为任何东西的类型找到了一个解决方法:
struct convert_to_anything
{
template<typename T>
operator T() const
{
return T{};
}
};
int main()
{
std::cout<<std::is_constructible<B, convert_to_anything, A, convert_to_anything>::value<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
(实际上,并且对我来说意外,我发现它实际上在explicit添加到...的构造函数中似乎也能正常工作B...而我认为它会阻止转换?)
尽管如此,通过这种解决方法,我将不得不测试所有可能的参数数量.A在第一个位置说一个:
std::is_constructible<B, A>::value
|| std::is_constructible<B, A, convert_to_anything>::value
|| std::is_constructible<B, A, convert_to_anything, convert_to_anything>::value
//... and so on …Run Code Online (Sandbox Code Playgroud) template <int N>
struct Factorial {
static const int value = N * Factorial<N - 1>::value;
};
// Base case via template specialization:
template <>
struct Factorial<0> {
static const int value = 1;
};
Run Code Online (Sandbox Code Playgroud)
因此,我可能已经发现,“ ::”运算符的作用是以某种方式将较早执行的操作的内容(N *阶乘)馈入/添加到“值”变量中。但是有人可以更彻底地解释这一点吗(我不介意对'::'运算符角色的完整解释)。
非常感谢你!