小编Dan*_*vil的帖子

为什么编译器不在数组或对象初始化器中抱怨额外的','?

使用简单类型

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# c#-3.0 c#-4.0

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

跨多个源文件的 C# 中的 Typedef

我正在编写一个 C 包装器,并希望使用 typedef 等价物来定义一些在相当多的源文件中应该有效的类型。这些“类型”只是 [u]int16/32/64_t 的不同别名,但对于区分函数参数很有用。

可以使用using MyId=System.Int32;,但就我所见,这需要在每个文件中重新声明......有没有更好的方法?

c#

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

迭代std :: vector(没有迭代器)时使用哪种类型?

也许这个问题很简单,但第二次考虑它我想知道如何以正确的方式做到以下几点:

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())或任何其他建议?请尝试考虑可移植性,错误倾向和性能,并在您的答案中保持客观.

编辑:我没有选择迭代器,因为它也想明确使用索引号.

c++

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

如何定义constexpr变量

我想使用一个简单的编译时常量,例如:

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在标题与源文件中定义时是否存在差异?

constexpr c++11

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

git rebase --abort 后恢复

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)

git git-rebase

5
推荐指数
2
解决办法
2579
查看次数

C++ 11 constexpr函数编译器错误与三元条件运算符(?:)

这段代码有什么问题?

#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)

c++ recursion ternary-operator constexpr c++11

4
推荐指数
2
解决办法
2583
查看次数

使用接口时实现类的特定类型

请考虑以下代码示例:

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#

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

为什么编译器没有警告没有名称的定义?

以下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)

所以现在我有点困惑.

c++

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

渲染为颜色通道而不影响其他通道

使用OpenGL(任何版本),如何通过一次仅影响一个颜色通道来渲染到帧缓冲区对象?

例如,我的帧缓冲区对象具有GL_BGRA布局.现在我想执行一些只应更改红色通道的渲染命令.因此,如果a片段将使用颜色(204,0,0,0)呈现,并且像素currenlty具有颜色(18,0,100,99),则结果应为(204,0,100,99).这适用于所有渠道(至少对于BGR而言).是否有某种掩码命令?

opengl

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

像'T'这样的模板参数是否总是被解释为per-value?

考虑以下小例子:

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.

c++ templates

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