小编Kos*_*Kos的帖子

无参数可变参数模板的模糊重载

有关:


考虑这对可变参数模板:

template<typename Dummy>
bool All(Param& c) {
    return true;
}

template<typename Dummy, Func* f, Func* ...rest>
bool All(Param& c) {
    return f(c) && All<Dummy, rest...>(c);
}
Run Code Online (Sandbox Code Playgroud)

这可以工作和编译.但是,如何在没有第一个模板参数的情况下编写它?

听起来微不足道?嗯,这就是我的想法.:-)让我们考虑一些想法.

想法#1:

template<Func* f, Func* ...rest>
bool All(Param& c) {
    return f(c) && All<rest...>(c);
}
template<>
bool All(Param& c) {
    return true;
}
Run Code Online (Sandbox Code Playgroud)

不会工作......当我尝试这个时,我心里有专长,但第二个想法不是它的工作原理.

在最初的例子中,我创建了两个不同的重载模板,首先采用1个模板参数,第二个采用2个或更多.没有歧义,也没有专业化.我做对了吗?

想法#2:

bool All(Param& c) {
    return true;
}

template<Func* f, Func* ...rest>
bool All(Param& c) {
    return f(c) && All<rest...>(c);
}
Run Code Online (Sandbox Code Playgroud)

不会明显工作,All<rest...> …

c++ template-meta-programming variadic-templates c++11

9
推荐指数
1
解决办法
1808
查看次数

语言如何处理复合运算符的副作用?

假设这样的情况:

int a = (--t)*(t-2);
int b = (t/=a)+t;
Run Code Online (Sandbox Code Playgroud)

在C和C++中,这是未定义的行为,如下所述:未定义的行为和序列点

但是,这种情况如何:

  • JavaScript中,
  • Java中,
  • PHP ...
  • C#
  • 那么,还有其他任何有复合算子的语言吗?

我正在修复一个Javascript - > C++端口,现在很多地方都没有注意到它.我想知道其他语言通常如何处理这个问题...保留命令undefined以某种方式特定于C和C++,不是吗?

javascript c c++ programming-languages undefined-behavior

8
推荐指数
1
解决办法
483
查看次数

const void*指向ctypes

如果我有一个可写的buffer,我可以使用ctypes.c_void_p.from_buffer函数来获得一个指向这个缓冲区的C指针.

但是,如何处理不可写的缓冲区呢?如何形成一个const指针,我可以传递给C代码,该代码期望const void*不使用不可写缓冲区的可写副本?

我考虑过c_void_p.from_address但缓冲区(和内存视图)似乎没有公开它们的地址.


一些澄清:

>>> import ctypes
>>> b = buffer("some data that supports the buffer interface, like a str")
>>> ptr = ctypes.c_void_p.from_buffer(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: buffer is read-only
>>> ptr = ctypes.c_void_p.from_buffer_copy(b)    # works, but has to copy data
>>> ptr = ctypes.CONST(c_void_p).from_buffer(b)  # (I'm making this one up)
>>> ptr = ctypes.c_void_p.from_address(???)      # could work; how to …
Run Code Online (Sandbox Code Playgroud)

python buffer ctypes const python-2.7

8
推荐指数
1
解决办法
2182
查看次数

Python 3中的Unicode字符串是否依赖于"窄"/"宽"构建?

从Python 2.2和PEP 261开始,Python可以以"窄"或"宽"模式构建,这会影响"字符"的定义,即"Python Unicode字符串的可寻址单元".

窄版本中的字符看起来像UTF-16代码单元:

>>> a = u'\N{MAHJONG TILE GREEN DRAGON}'
>>> a
u'\U0001f005'
>>> len(a)
2
>>> a[0], a[1]
(u'\ud83c', u'\udc05')
>>> [hex(ord(c)) for c in a.encode('utf-16be')]
['0xd8', '0x3c', '0xdc', '0x5']
Run Code Online (Sandbox Code Playgroud)

(上面似乎不同意一些 来源,他们坚持认为窄版本使用的是UCS-2,而不是UTF-16.确实非常有趣)

Python 3.0是否保持这种区别?或者所有Python 3都构建广泛?

(我听说过PEP 393改变了3.3中字符串的内部表示,但这与3.0~3.2无关.)

python unicode python-3.x

8
推荐指数
1
解决办法
1183
查看次数

RestSharp RestRequest.AddBody不使用Newton.Json属性

var obj = new MyObject();
Run Code Online (Sandbox Code Playgroud)

我遇到RestSharp的问题RestRequest.AddBody(obj); 正确序列化对象.

class MyObject
{
   [JsonProperty(PropertyName="a")]
   public A{get;set;}

   [JsonProperty(PropertyName="b")]
   public B{get;set;}
}
Run Code Online (Sandbox Code Playgroud)

问题是AddBody序列化器没有考虑我的JsonProperty属性,我似乎可以弄清楚如何在RestRequest或RestClient上设置序列化器?

c# restsharp

8
推荐指数
2
解决办法
6889
查看次数

始终像对待 Django Admin 中的 raw_id_fields 一样对待 ForeignKey 字段

这种情况在我的项目中经常发生:

  • 有人添加了一个Foo具有多个ForeignKey字段的模型,其中一个是指模型Bar
  • 为该模型添加了一个管理员(并且工作正常)
  • 代码已部署
  • 在生产服务器上,Bar有数百万个实例
  • 有人访问Foo的管理页面;Django 尝试Bar一次检索所有s(将它们显示在组合框中)并且服务器过载
  • 后来通过编辑Foo管理员并添加barraw_id_fields.

我想防止这种情况在未来发生,最好通过某种方式声明(一劳永逸)Bar有很多行,并且应该始终将引用它的字段视为raw_id_fields所有管理页面中列出的字段。这有可能吗?

python django django-admin

8
推荐指数
1
解决办法
924
查看次数

用原始或智能指针在c ++中组合?

我想做的一个小例子.

我有一个(堆栈分配)顶点的列表

class Vertex {

    int id;
    double x;
    double y;
    double z;
};
Run Code Online (Sandbox Code Playgroud)

并想要创建边缘列表

class Edge {

    int id;
    Vertex * source;
    Vertex * target;
};
Run Code Online (Sandbox Code Playgroud)

两个指向其源和目标顶点的指针.

通常我会在这里找一个参考,但我希望能够在运行时更改源或目标顶点,所以我需要某种指针类型.

所以我的问题是:是否有一个智能指针在这里很有用,或者我应该只使用上面的普通指针?

编辑

解决了答案中出现的一些问题:

首先,列表应该拥有顶点,这就是它们在堆栈中的原因.

其次,ID用于其他程序.

它需要一个文件,其中包含所有顶点及其坐标的列表,以及所有边的列表及其两个顶点的ID.

第三,我需要某种指针,因为顶点的id在运行时会发生变化,而边缘的源和目标顶点可能会变为.

(其中包括进行某种切割和切片)

c++ oop smart-pointers composition

7
推荐指数
1
解决办法
1071
查看次数

如何在OpenGL中获取原始(未转换的)纹理数据?

我需要序列化一个任意的OpenGL纹理对象,以便能够在以后使用完全相同的状态和数据来恢复它.

我正在寻找一种获取纹理图像数据的方法.这是我到目前为止所发现的:

  • glGetTexImage.

    它允许获取纹理图像,但它需要指定的格式/类型对(如(GL_RGBGL_HALF_FLOAT)它执行转换.

    允许的格式和类型不会将1:1映射到图像格式,并且不允许获得更加模糊的格式,例如GL_R3_G3_B2没有额外的转换.

    同样正确地确定基本内部格式的C类型(如GL_RGB没有大小)涉及一些非平凡的劳动.

  • ARB_internalformat_query2允许询问GL_GET_TEXTURE_IMAGE_FORMATGL_GET_TEXTURE_IMAGE_TYPE代表glGetTexImage给定纹理的最佳选择.

    很好,但是受到同样的限制,glGetTexImage并且没有广泛使用.

  • 有精彩的glGetCompressedTexImage是优雅的返回压缩纹理的数据,是的,但它也不适用于非压缩图像,也有一个对应的那会.

这些都不允许获取或设置非压缩纹理的原始数据.有办法吗?

opengl serialization textures

7
推荐指数
1
解决办法
864
查看次数

可以rethrow_exception真的抛出相同的异常对象,而不是副本吗?

在研究内容时exception_ptr,C++ 11标准说(18.8.5/7):

在引用同一异常对象的exception_ptr对象上使用rethrow_exception不应引入数据争用.[注意:如果rethrow_exception重新抛出相同的异常对象(而不是副本),对该重新抛出的异常对象的并发访问可能会引入数据争用......

我没有找到这种奇怪的"注释"适用的情况,因为所描述的效果rethrow_exception是"抛出:p引用的异常对象"但是15.1/3,描述了抛出异常副本的一般异常抛出过程强制要求 - 初始化一个临时对象,称为异常对象."

奇怪的说明意味着rethrow_exception会跳过此复制初始化.但这真的有可能吗?

c++ language-lawyer c++11

7
推荐指数
1
解决办法
1867
查看次数

重置Javascript对象中所有值的最佳方法

我的javascript对象看起来像:

$scope.display = {
  current: {
       key1: 'value1',
       key2: ['a', 'b'],
       key3: 'value2'
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的代码中的一些事件,我想将这些值重置为undefined,如下所示:

$scope.display = {
  current: {
       key1: undefined,
       key2: [],
       key3: undefined
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用像lodash这样的库,但是我没有看到任何可以执行此操作的函数.我知道如何手动执行此操作,但我想知道是否有"最佳实践"方法来执行此任务.

javascript lodash

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