小编awf*_*the的帖子

`static_cast<bool>(x)` 和 `x != 0.0` 之间有区别吗?

设置

我正在使用名为 MotionBuilder 的应用程序的 API。为了访问 MotionBuilder 属性的值,您可以将其读入双精度变量,无论它实际表示哪种数据类型。

这是我编写的用于评估标量属性值的实用函数:

template <typename DataT>
inline DataT GetScalar(FBProperty& prop, FBEvaluateInfo* evaluateInfo)
{
    double data = 0.0;
    prop.GetData(&data, sizeof(data), evaluateInfo);
    return static_cast<DataT>(data);
}
Run Code Online (Sandbox Code Playgroud)

这样,我可以编写GetScalar<float>(camera.Roll, evaluateInfo)orGetScalar<bool>(camera.Visibility, evaluateInfo)来代替多行乱七八糟的未初始化缓冲区和强制转换乱七八糟的代码。

我正在 Visual Studio 中进行编译/W4并解决出现的所有警告。当我使用时GetScalar<bool>,编译器会产生C4800 警告

'double' : forcing value to bool 'true' or 'false' (performance warning)
Run Code Online (Sandbox Code Playgroud)

当编译器创建 时GetScalar<bool>,它最终会从 double 到 bool 进行 static_cast ,这显然是它不喜欢的。由于我最初的目标是使用单个模板函数处理多种类型(bool、float、double 等),因此我不能只添加通常的!= 0.0.

为了解决这个警告,我有两个选择。

选项1

我可以直接使用编译指示来抑制警告,因为演员正在做我想要它做的事情:

template <typename DataT>
inline DataT GetScalar(FBProperty& …
Run Code Online (Sandbox Code Playgroud)

c++ templates warnings casting

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

如何从父模块命名空间中的子模块中创建类?

这是一个python模块.foosys.path.

foo\
    __init__.py
    bar\
        __init__.py
        base.py
            class Base(object)
        derived.py
            import foo.bar.base as base
            class Derived(base.Base)
Run Code Online (Sandbox Code Playgroud)

我还没有想到什么.如果我想从模块中实例化Derivedderived,我可以很容易地做到这一点:

import foo.bar.derived as derived
print(derived.Derived())
Run Code Online (Sandbox Code Playgroud)

但是,我想导入bar模块并调用bar.Derived(),因为我计划在许多不同的模块中有很多类,我不想处理所有这些突然的导入路径.我的理解是,我可以简单地将Derived导入到bar模块的命名空间中,方法是修改我的项目:

foo\
    __init__.py
    bar\
        __init__.py
            from foo.bar.derived import Derived
        base.py
            class Base(object)
        derived.py
            import foo.bar.base as base
            class Derived(base.Base)
Run Code Online (Sandbox Code Playgroud)

现在我应该能够做到以下几点:

import foo.bar as bar
print(bar.Derived())
Run Code Online (Sandbox Code Playgroud)

但我得到一个AttributeError抱怨该foo模块没有子模块调用bar:

test.py             (1): import foo.bar
foo\bar\__init__.py (1): from foo.bar.derived import Derived
foo\bar\derived.py  (1): import …
Run Code Online (Sandbox Code Playgroud)

python import namespaces module package

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

标签 统计

c++ ×1

casting ×1

import ×1

module ×1

namespaces ×1

package ×1

python ×1

templates ×1

warnings ×1