我有一个现有的代码库,可以很好地利用 Boost。特别是,它在几个地方使用了不同风格的 boost::variant
:
typedef boost::variant<double, int, unsigned int, size_t, bool> MBVariant;
typedef boost::variant<double, float> FPVariant;
// ...
它还使用其他 Boost 工具,例如:
typedef boost::shared_ptr<int> MyPtr;
我正在将此代码移植到一个不支持 Boost 的新平台,但必须与支持 Boost 的平台一起维护。因此,我正在创建一个“Boost-wrapping”层,这将有助于消除对 Boost 的依赖:
#ifdef USE_BOOST
# include <boost/shared_ptr.hpp>
# include <boost/variant.hpp>
template <class T>
using my_shared_ptr = boost::shared_ptr<T>
// how to wrap variant?
// template <typename T0_, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename T)>
// using my_variant = boost::variant<T0_, ???>;
#else
# include <memory>
// in the absence of Boost, use something else like std::shared_ptr:
template <class T>
using my_shared_ptr = std::shared_ptr<T>
// wrap variant with something non-Boost
template <typename T0, /* uh... */>
class variant { /* ... */ };
#endif
现在客户端代码可以根据是否为目标平台定义了 USE_BOOST 来使用 my_shared_ptr 或 my_variant:
typedef my_variant<double, int, unsigned int, size_t, bool> MBVariant;
typedef my_variant<double, float> FPVariant;
typedef my_shared_ptr<int> MyPtr;
我的问题是 boost::variant
是一个类模板,它采用递归类型列表形式的任意数量的参数类型。我不确定 typedef 或类型别名是否(或如何)可以解决这个问题。
是否有一种通用的方法来包装 boost::variant
用于此目的?
我知道我可以使用简单的 typedef 为 boost::variant
的特定 参数集提供新的类型名称,但我的数量并不多目前,这是有可能的,但我对输入别名的一般方法非常感兴趣,例如 boost::variant
,同时尽可能避免使用预处理器将其集成到 namespace 层次结构中。
最佳答案
template <typename... T>
using my_variant = boost::variant<T...>
或者,如我所愿
namespace library
{
#if defined(HAS_BOOST)
using boost::variant;
#else
using my_utils::variant;
#endif
}
请注意,无论哪种情况,您都会遇到与 ADL 和特化相关的问题。只要您使用 typedef,就无法隐藏条件语句的存在。
相反,您可以/应该编写自己的接口(interface) header 并换出实现文件。
关于C++ - 如何键入别名、typedef 或包装 boost::variant?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24074161/