小编im *_*sed的帖子

派生类使用模板没有开销?

我想完成以下事项:

  1. 宾语.
  2. 调试对象版本,在函数中具有额外功能以进行跟踪.

现在,我目前有一个使用宏的编译时解决方案,do {} while(0)如果没有使用正确的标志编译库,则解析为a .

我想将此功能转移到在运行时启用.做这个的最好方式是什么?

我想做:Base * obj = (isGlobalDebugEnabled) ? new Debug(...) : new Base(...);输入东西.我是不是想要这样的东西?

注意,标准虚函数并不能真正解决问题,因为每个函数都必须在对象的派生(调试)版本中复制,从而破坏了目的.

此外,最低级别的功能是非常高的音量(配置文件时大于6000亿次调用)所以我想为"基类"编译一个编译的零开销解决方案.当然,Debug对象可能更慢.

这就是我想到模板的原因.注意:除了VS2010功能(基本lambda等)之外,我没有C++ 11/boost访问权限.我能做点什么吗

template <bool debug = false>
class Object {
    std::enable_if<debug> void printTrace(); // Add functions based on debug/not
};
void Object::doSomething(...){
    <only do this if debug without runtime check> addToTrace(...);
    doTheStuff();
}
Run Code Online (Sandbox Code Playgroud)

我看到这个链接指向我伪造的继承与模板方向,如果这有帮助.

谢谢您的帮助

AK

编辑:我刚刚意识到我可能会采用错误的方式 - 可能将Debug对象作为基类,并在Regular对象中使用no-ops覆盖功能.这似乎是一种更好的方式.但是,由于这些高性能要求,我仍然希望避免vtable跳转,所以我猜我的模板问题仍然存在?也许?

编辑2:正如KerrickSB所指出的,使用的一个例子可能更清楚:

主要代码:

void ComputeSomething() {
    Object * obj = (globalDebugFlag) …
Run Code Online (Sandbox Code Playgroud)

c++ macros optimization inheritance templates

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

确定`identical()`返回FALSE的原因

我有两个我希望相同的data.frames ,但是same()返回false。

作为背景,一个DF来自Iris数据ARFF文件,另一个来自.rdata文件(如果更改了任何内容)

x == y中的所有元素均为TRUE,两个变量的类相同,两个行名也相同,列名也相同。

如何确定是什么触发了FALSE输出?

编辑:all.equal的输出,如下所述

[1] "Component 1: Attributes: < Modes: list, NULL >"                                
[2] "Component 1: Attributes: < names for target but not for current >"             
[3] "Component 1: Attributes: < Length mismatch: comparison on first 0 components >"
Run Code Online (Sandbox Code Playgroud)

编辑:两者的属性的输出

> attributes(dataset)
$names
[1] "Class"        "petal-length" "petal-width"  "sepal-length" "sepal-width" 
$row.names
[1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23 …
Run Code Online (Sandbox Code Playgroud)

r dataframe

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

选择列,但转换给定类型的所有列

我需要一些逻辑上等价的东西

select cast(* as numeric IF data_type='decimal') from table_name
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做,所以我想把它分成两个步骤:

select * from table_name where data_type!='decimal'

select cast(* as numeric) from table_name where data_type='decimal'
Run Code Online (Sandbox Code Playgroud)

但我意识到我也不知道该怎么做。由于 SO,我可以找到十进制的列名列表,但由于这是一个批处理过程,我不能将其分为两个步骤

我正在尝试做的可能吗?我只想得到一组列,但如果它们是十进制的,则将它们转换为双精度。

谢谢!

sql

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

memsetting初始化缓冲区的原因是什么

在浏览维基百科之后,我偶然发现了以下代码示例,该示例将char缓冲区初始化为0,但memset在使用之前将其初始化为0.这有必要吗?如果是这样,为什么?我问的原因是我不是专家,并且这个例子清楚地表明这是编码器的意图,其中注释" /* Really initialized to zeroes */" 与初始化上的memset" /* initialized to zeroes */" 相反.

编辑:注意,我已经在维基百科页面上回滚了导致这种情况的编辑,因此它在链接中不再可见.

c initialization memset

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

标签 统计

c ×1

c++ ×1

dataframe ×1

inheritance ×1

initialization ×1

macros ×1

memset ×1

optimization ×1

r ×1

sql ×1

templates ×1