小编vid*_*vid的帖子

C++:我应该使用'typedef'还是'using namespace'?

我正在编写一个包含多个依赖模块的库.当我包含来自不同模块的文件时,我是否应该使用以下命令解析命名空间:

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'的类,则会导致名称空间不明确.

c++ namespaces using-directives

39
推荐指数
3
解决办法
1万
查看次数

Dyamic与C++中的静态多态性:哪个更好?

我知道动态/静态多态性取决于应用程序的设计和要求.但是,如果可能的话,是否建议选择动态静态多态?特别是,我可以在我的应用程序中看到以下2个设计选择,这两个设计似乎都被建议不要:

  1. 使用CRTP实现静态多态性:没有vtable查找开销,同时仍以模板基类的形式提供接口.但是,使用很多开关和static_cast来访问正确的类/方法,这是危险的

  2. 动态多态性:实现接口(纯虚拟类),将查询成本与偶然的简单函数(如访问器/更改器)相关联

我的应用程序非常关键,所以我赞成静态多态.但需要知道使用过多的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非常安全且没有性能损失(编译时限)?

c++ polymorphism optimization static-polymorphism

18
推荐指数
3
解决办法
5234
查看次数

Boost.Python:无法包装 C++“operator&lt;&lt;”以在 Python 中公开打印功能

我正在尝试包装一个使用 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

ostream boost-python python-2.7

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