使用预处理器定义在一组类型之间进行选择

Use preprocessor definitions to choose between a set of types

本文关键字:类型 一组 之间 选择 行选 预处理 处理器 定义      更新时间:2023-10-16

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

#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 和更多以获得更多选项。只是为了脑力劳动,还有更好的方法吗?

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

现在,除非你有充分的理由更喜欢 Boost vectors 而不是 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;

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

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

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