使用预处理器定义在一组类型之间进行选择
Use preprocessor definitions to choose between a set of types
我有一个预处理代码来选择使用哪个向量类,如下所示:
#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一个很好的解释
- 检查一组类型是否是具有组合的子集
- 为什么此模板定义了一组匹配void的别名类型
- 有没有办法在编译时检测是否可以使用一组给定的参数类型成功调用通用 lambda?
- 使用模板元编程表示一组类型C++
- 如果您的团队同意一组别名,则使用类型别名进行STL容器不良练习
- 如何查找一组类型对是否包含一个元素作为第二个成员
- C 将一组值映射到类型
- 将 constexpr 数组扩展为一组非类型模板参数
- c++我需要将文件中的数据读取到多维数组中,然后用一种数据类型对数组进行排序.怎样
- 在一组模板参数中插入任意数量的类型
- 使用C++可变模板,我如何存储一组异构类型的对象并对它们进行迭代
- 返回一组数据类型之一的最佳模式
- 我应该更喜欢mixin还是函数模板来将行为添加到一组不相关的类型中
- 运算符重载,用于创建一组类型为 pair<int、int> 的元素
- 按类型在一组数据成员中进行选择,其中每种类型仅使用一次
- 为一组类型专门化多个模板
- 在另一个类中实例化具有相同构造函数的一组类中的类类型变量
- 在编译时,我能告诉Boost.Fenix lambda的一组特定输入类型是否有效吗
- 强制函数只接受一组特定的数据类型
- 在C语言中,一组函数的名称可能因操作数类型的不同而不同,称为理论静态多态函数