1

我有一个预处理代码来选择使用哪个向量类,如下所示:

#define USE_BOOST_VECTOR

#ifdef USE_BOOST_VECTOR
    #include <boost/container/vector.hpp>
    #define VECTOR boost::container::vector
#else
    #include <vector>
    #define VECTOR std::vector
#endif

我不确定这是否是一个好方法。如果我有更多的选择,我该怎么办?

弄清楚是否有更多选择

#define USE_MY_VECTOR 1
#define USE_BOOST_VECTOR 2
#define USE_STD_VECTOR 3

#define CHOOSE_VECTOR USE_BOOST_VECTOR

#if CHOOSE_VECTOR == USE_MY_VECTOR
    #include "Vector.h"
    #define VECTOR Vector
#elif CHOOSE_VECTOR == USE_BOOST_VECTOR 
    #include <boost/container/vector.hpp>
    #define VECTOR boost::container::vector
#elif CHOOSE_VECTOR == USE_STD_VECTOR
    #include <vector>
    #define VECTOR std::vector
#endif

但我需要定义 1、2、3 等以获得更多选项。只是为了脑力劳动,有更好的方法吗?

4

2 回答 2

2

不要使用预处理器宏,除非你别无选择——typedef、常量,如果真的需要,模板通常可以达到预期的结果,同时更安全。

现在,除非您有充分的理由更喜欢 Boost 向量而不是 std::vector,否则请使用 std::vector。为什么?因为如果你不知道自己想要什么,std 命名空间提供的东西应该绰绰有余。

编辑:就像 leemes 所说,您需要 C++11 才能使用模板类型别名。

#define USE_BOOST_VECTOR

#ifdef USE_BOOST_VECTOR
    #include <boost/container/vector.hpp>
    template <typename T> using VECTOR = boost::container::vector<T>;
#else
    #include <vector>
    template <typename T> using VECTOR = std::vector<T>;
#endif

// ....
// You could then use it with
VECTOR<int> vec;

最后,这里是关于模板化 typedef 别名的更多信息

如果您没有 C++11 编译器,则可以使用命名空间别名:

#define USE_BOOST_VECTOR

#ifdef USE_BOOST_VECTOR
    #include <boost/container/vector.hpp>
    namespace Container = boost::container;
#else
    #include <vector>
    namespace Container = std;
#endif

//And use it with...
Container::vector<int> vec;

我还需要在这里补充一点,上面的方法会导致一些非常混乱的结果。我强烈建议您基本上预先决定要使用哪种矢量实现,并一劳永逸地摆脱您的预处理器宏。随着时间的推移,您的代码会感谢您:)

于 2013-02-01T01:09:48.377 回答
0

这是一个坏主意,因为预处理器的用途与您使用它们的用途完全不同。更具体地说,它们用于扩展您正在使用的语言。这可能是一些简单的事情,比如为语言中的命令创建别名,也可能是复杂的事情,比如向语言中添加新的语义结构,例如添加对象面向过程语言的编程能力。无论如何,不​​要在编译时选择将哪些类库加载到您的程序中。我的建议是创建一个接口类,然后从这个类继承两个类。一个类将作为 boost 向量的包装器,而另一个作为 std::vector 的包装器。这样,您不仅可以在编译时(静态)选择实现,

有关详细信息,请参阅以下链接: OOP 一个很好的解释

于 2013-02-01T01:56:28.983 回答