Please take note of the updates at the end of this post.
Update: I have created a public project on GitHub for this library!
I would like to have a single template that once and for all takes care of pretty-printing all STL containers via operator<<. In pseudo code, I'm looking for something like this:
template<container C, class T, String delim = ", ", String open = "[", String close = "]">
std::ostream & operator<<(std::ostream & o, const C<T> …Run Code Online (Sandbox Code Playgroud) std::array远远优于C阵列.即使我想与遗留代码进行互操作,我也可以使用std::array::data().有什么理由我想要一个老派阵列吗?
如何使用标准模板库std::sort()对声明为的数组进行排序
int v[2000];
C++是否提供了一些可以获取数组的开始和结束索引的函数?
的C++ 0x将会使下面的代码和类似代码形成不良的,因为它需要一个所谓的收缩转换的double一个int.
int a[] = { 1.0 };
Run Code Online (Sandbox Code Playgroud)
我想知道这种初始化是否在现实代码中被大量使用.这个改变将破坏多少代码?如果您的代码受到影响,是否需要在代码中修复此问题?
供参考,参见n3225的8.5.4/6
缩小转换是隐式转换
- 从浮点类型到整数类型,或
- 从long double到double或float,或从double到float,除非source是常量表达式,转换后的实际值在可以表示的值范围内(即使它不能精确表示),或者
- 从整数类型或无范围枚举类型到浮点类型,除非源是常量表达式,转换后的实际值将适合目标类型,并在转换回原始类型时生成原始值,或者
- 从整数类型或未范围的枚举类型到不能表示原始类型的所有值的整数类型,除非source是常量表达式,并且转换后的实际值将适合目标类型并且将在生成原始值时生成原始值转换回原始类型.
最近我发现了很多例子,其中大部分都是关于C++ 98的,反正我已经创建了我的简单数组和循环(codepad):
#include <iostream>
using namespace std;
int main ()
{
string texts[] = {"Apple", "Banana", "Orange"};
for( unsigned int a = 0; a < sizeof(texts); a = a + 1 )
{
cout << "value of a: " << texts[a] << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
value of a: Apple value of a: Banana value of a: Orange Segmentation fault
它工作正常,除了最后的分段错误.
我的问题是,这个数组/循环是否完成了一个好方法?我正在使用C++ 11,所以我想确保它符合标准并且无法以更好的方式完成?
该标准模板std::pair和std::array有特殊情况std::tuple,它按理说,他们应该有一个非常类似的功能集.
然而,三者中唯一的,std::pair允许分段构造.也就是说,如果该类型T1并T2可以从一组参数来构建a1, a2, ...和b1, b2, ...,然后讲道德,我们可以做一对
"pair<T1, T2> p(a1, a2, ..., b1, b2, ...)"
Run Code Online (Sandbox Code Playgroud)
直.实际上,这是拼写为这样的:
std::pair<T1, T2> p(std::piecewise_construct,
std::forward_as_tuple(a1, a2, ...),
std::forward_as_tuple(b1, b2, ...));
Run Code Online (Sandbox Code Playgroud)
问题:为什么阵列和元组不存在相同的分段构造性?有一个深刻的原因,还是一个普通的遗漏?例如,拥有以下内容会很高兴:
std::tuple<T1, T2, T3> t(std::piecewise_construct,
std::forward_as_tuple(a1, a2, ...),
std::forward_as_tuple(b1, b2, ...),
std::forward_as_tuple(c1, c2, ...));
Run Code Online (Sandbox Code Playgroud)
有没有理由不能这样做?[ 编辑:或者我是否完全误解了分段建设的目的?]
(我确实有一种情况,我希望初始化一个带有默认元素值的元组向量,我宁愿直接从参数构造,而不是再次拼写出每个元组元素类型.)
我怎样才能a3编译?
int main()
{
int a1[] = { 1, 2, 3 };
std::array<int, 3> a2 = { 1, 2, 3 };
std::array<int> a3 = { 1, 2, 3 };
}
Run Code Online (Sandbox Code Playgroud)
使用初始化列表时,对数组的大小进行硬编码是非常不方便的,也是很脆弱的,特别是长的列表.有什么工作吗?我希望如此,否则我很失望,因为我讨厌C阵列,std::array应该是他们的替代品.
我想为我的应用程序使用可变参数模板功能,但我不希望通过值传递对象(因为对象在我的情况下非常复杂).我想通过引用传递它们(而不是作为指针).
void func()
{
}
template<typename Function1, typename... FurtherFunctions>
void func(Function1 f1, FurtherFunctions... further_functions)
{
// doing some processing here...
}
Run Code Online (Sandbox Code Playgroud)
我如何通过引用传递参数并确保它们不被复制?
我一直在玩,auto我注意到在大多数情况下你可以用一个变量定义替换auto,然后分配类型.
在下面的代码w和x都相等(默认情况下初始化int,还是让我们无法进入潜在副本).有没有办法声明z它具有相同的类型y?
int w{};
auto x = int{};
int y[5];
auto z = int[5];
Run Code Online (Sandbox Code Playgroud) 假设您想要一个与类关联的预定义值/对象(const或非const)的静态数组.可能的选项是使用std:vector,std::array或C-style array (ie. []),或.例如,
在.hpp:
class MyClass {
public:
static const std::vector<MyClass> vec_pre; // No efficient way to construct with initializer list, since it always uses Copy Contructor, even when using std::move
static const std::array<MyClass, 2> arr_pre; // Have to specify size which is inconvenient
static const MyClass carr_pre[]; // Not compatible with C++11 for-range since size is undefined
};
Run Code Online (Sandbox Code Playgroud)
在.cpp
const std::vector<MyClass> MyClass::vec_pre = { std::move(MyClass{1,2,3}), std::move(MyClass{4,5,6}) }; // NOTE: This still uses …Run Code Online (Sandbox Code Playgroud)