我有一个预处理代码来选择使用哪个矢量类:
#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等更多选项。只是为了大脑工作,还有更好的方法吗?
答案 0 :(得分: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;
最后,还有一些information on templated typedef aliases
如果您没有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;
我还需要在这里添加,上述方法可能会导致一些非常混乱的结果。我强烈建议你基本上先决定你想要使用哪个矢量实现并一劳永逸地摆脱你的预处理器宏。您的代码会随着时间的推移感谢您:)
答案 1 :(得分:0)
这是一个坏主意,因为预处理器的用途与您使用它们的目的完全不同。更具体地说,它们用于扩展您正在使用的语言。这可以用于为语言中的命令创建别名这样简单的事情,或者像为语言添加新的语义结构那样复杂的事情,例如添加对象面向程序语言的编程能力。无论如何,不要选择在编译时加载到程序中的类库。我的建议是创建一个接口类,然后从这个类继承两个类。一个类将充当boost矢量的包装器,另一个类充当std :: vector的包装器。这样,您不仅可以在编译时(静态)选择实现,还可以在运行时(动态)选择实现。
有关详细信息,请参阅以下链接: OOP a good explaination