我正在使用名为 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.
为了解决这个警告,我有两个选择。
我可以直接使用编译指示来抑制警告,因为演员正在做我想要它做的事情:
template <typename DataT>
inline DataT GetScalar(FBProperty& …Run Code Online (Sandbox Code Playgroud) 这是一个python模块.foo是sys.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)
我还没有想到什么.如果我想从模块中实例化Derived类derived,我可以很容易地做到这一点:
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)