我正在编写一个包含多个依赖模块的库.当我包含来自不同模块的文件时,我是否应该使用以下命令解析命名空间:
using namespace project1::namespace1;
class1 obj;
Run Code Online (Sandbox Code Playgroud)
要么
typedef project1::namespace1::class1 class1;
class1 obj;
Run Code Online (Sandbox Code Playgroud)
每种方法的优缺点是什么?我读到了我们应该typedef在.H文件和using.C文件中使用的地方,这是可取的吗?
我遇到的'typedef'的一个问题是,如果我在第三个模块中包含原始类和带有'typedef'的类,则会导致名称空间不明确.
我知道动态/静态多态性取决于应用程序的设计和要求.但是,如果可能的话,是否建议选择动态静态多态?特别是,我可以在我的应用程序中看到以下2个设计选择,这两个设计似乎都被建议不要:
使用CRTP实现静态多态性:没有vtable查找开销,同时仍以模板基类的形式提供接口.但是,使用很多开关和static_cast来访问正确的类/方法,这是危险的
动态多态性:实现接口(纯虚拟类),将查询成本与偶然的简单函数(如访问器/更改器)相关联
我的应用程序非常关键,所以我赞成静态多态.但需要知道使用过多的static_cast是否表明设计不佳,以及如何在不产生延迟的情况下避免使用.
编辑:感谢您的见解.以具体案例为例,哪一种更好?
class IMessage_Type_1
{
virtual long getQuantity() =0;
...
}
class Message_Type_1_Impl: public IMessage_Type_1
{
long getQuantity() { return _qty;}
...
}
Run Code Online (Sandbox Code Playgroud)
要么
template <class T>
class TMessage_Type_1
{
long getQuantity() { return static_cast<T*>(this)->getQuantity(); }
...
}
class Message_Type_1_Impl: public TMessage_Type_1<Message_Type_1_Impl>
{
long getQuantity() { return _qty; }
...
}
Run Code Online (Sandbox Code Playgroud)
请注意,每个类中都有几个mutators/accessors,我需要在我的应用程序中指定一个接口.在静态多态性中,我只切换一次 - 获取消息类型.但是,在动态多态性中,我使用虚函数进行EACH方法调用.这不是一个使用静态聚合物的情况吗?我相信CRTP中的static_cast非常安全且没有性能损失(编译时限)?
我正在尝试包装一个使用 Boost.Python 处理二进制值的 C++ 类。对于此类,“<<”运算符已定义为
std::ostream &operator<<(std::ostream &output, const bin &inbin);
Run Code Online (Sandbox Code Playgroud)
我试着用
class_<bin>("bin", init<>())
.def(str(self));
Run Code Online (Sandbox Code Playgroud)
但是,编译会引发此错误:
boost/python/def_visitor.hpp:31:9: error: no matching function for call to
‘boost::python::api::object::visit(boost::python::class_<itpp::bin>&) const’
Run Code Online (Sandbox Code Playgroud)
我不知道如何解决这个错误,有人知道吗?
参考:http : //www.boost.org/doc/libs/1_31_0/libs/python/doc/tutorial/doc/class_operators_special_functions.html