使用简单类型
class A {
public int X, Y;
}
Run Code Online (Sandbox Code Playgroud)
使用对象初始化器,可以编写
var a = new A { X=0, Y=0 };
Run Code Online (Sandbox Code Playgroud)
但编译器也接受以下内容:
var a = new A { X=0, Y=0, }; // notice the additional ','
Run Code Online (Sandbox Code Playgroud)
同样的 int[] v = new int[] { 1, 2, };
这看起来有点奇怪......他们是否忘记在编译器中拒绝额外的','或者这背后有更深层的含义?
我正在编写一个 C 包装器,并希望使用 typedef 等价物来定义一些在相当多的源文件中应该有效的类型。这些“类型”只是 [u]int16/32/64_t 的不同别名,但对于区分函数参数很有用。
可以使用using MyId=System.Int32;,但就我所见,这需要在每个文件中重新声明......有没有更好的方法?
也许这个问题很简单,但第二次考虑它我想知道如何以正确的方式做到以下几点:
std::vector<K> v = ...;
for(T i=0; i<v.size(); ++i) {
const K& t = v[i];
// use t *and i*
}
Run Code Online (Sandbox Code Playgroud)
应该T是什么类型的?int,unsigned int,int32_t,size_t(这将是的类型v.size())或任何其他建议?请尝试考虑可移植性,错误倾向和性能,并在您的答案中保持客观.
编辑:我没有选择迭代器,因为它也想明确使用索引号.
我想使用一个简单的编译时常量,例如:
double foo(double x) { return x + kConstDouble; }
Run Code Online (Sandbox Code Playgroud)
现在我至少看到以下定义该常量的方法
namespace { static constexpr double kConstDouble = 5.0; }
namespace { constexpr double kConstDouble = 5.0; }
static constexpr double kConstDouble = 5.0;
constexpr double kConstDouble = 5.0;
Run Code Online (Sandbox Code Playgroud)
哪种方式正确?kConstDouble在标题与源文件中定义时是否存在差异?
git rebase一天前我在我的存储库中启动了一个,但从未完成它。当我还在 rebase 时,我忘记了并做了很多修改。今天我不小心做了一个git rebase --abort 没有把这些修改放在提交中。现在看起来我所有的修改都没有了。有什么办法可以恢复它们吗?
我的git reflog看起来像这样:
57d731c HEAD@{0}: rebase: aborting
d2d3738 HEAD@{1}: rebase -i (start): checkout david
57d731c HEAD@{2}: commit: My commit message
Run Code Online (Sandbox Code Playgroud) 这段代码有什么问题?
#include <iostream>
template<unsigned int N, unsigned int P=0>
constexpr unsigned int Log2() {
return (N <= 1) ? P : Log2<N/2,P+1>();
}
int main()
{
std::cout << "Log2(8) = " << Log2<8>() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译时gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5),我收到以下错误:
log2.cpp: In function ‘constexpr unsigned int Log2() [with unsigned int N = 0u, unsigned int P = 1023u]’:
log2.cpp:5:38: error: template instantiation depth exceeds maximum of 1024 (use -ftemplate-depth= to increase the maximum) instantiating ‘constexpr …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码示例:
interface IData {
int Count();
}
interface IOperations {
IData Foo();
double Bar(IData a);
}
class Data1 : IData {
public int Count() { return 37; }
public double SomethingElse { get; set; }
}
class Ops1 : IOperations
{
public Data1 Foo() { return new Data1(); } // want to return specific type here
public double Bar(Data1 x) { ... } // want to get specific type here
// and not use operator as everywhere
}
// more …Run Code Online (Sandbox Code Playgroud) 以下C++代码什么都不做(使用GCC 4.4.3) - 它不打印文本:
struct MyStruct { MyStruct() { cout << "Hello" << endl; } };
void foo() {
MyStruct ();
}
Run Code Online (Sandbox Code Playgroud)
我认为这不是那么明显......更不用说忘记给出变量名的危险了.是否有编译器选项/警告禁止编译此类代码或允许它背后有任何隐藏的秘密?
编辑:对不起.上面的版本实际MyStruct();打印.不打印的版本是:
void bar() {
MyStruct a();
}
Run Code Online (Sandbox Code Playgroud)
所以现在我有点困惑.
使用OpenGL(任何版本),如何通过一次仅影响一个颜色通道来渲染到帧缓冲区对象?
例如,我的帧缓冲区对象具有GL_BGRA布局.现在我想执行一些只应更改红色通道的渲染命令.因此,如果a片段将使用颜色(204,0,0,0)呈现,并且像素currenlty具有颜色(18,0,100,99),则结果应为(204,0,100,99).这适用于所有渠道(至少对于BGR而言).是否有某种掩码命令?
考虑以下小例子:
template<typename T> void foo(T a) { ... }
struct Bar { ... };
Bar x;
foo(x);
Run Code Online (Sandbox Code Playgroud)
我的问题:是否有任何情况foo(x)可以解释为foo(const Bar& x)(x通过引用传递),或者它总是被解释为foo(Bar x)(x通过值传递,即x的显式副本)?
在我的具体应用程序中,我的代码依赖于创建副本的事实(x在另一个线程中使用,而原始x超出范围).但我不确定我是否可以这样认为.我正在使用GCC 4.6.1.