C++ - 如何键入别名、typedef 或包装 boost::variant?

标签 c++ templates boost boost-variant

我有一个现有的代码库,可以很好地利用 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/

相关文章:

django - 搜索后分页的第二页在django中不起作用

c++ - OSX 上 boost::program_options 和 C++11 的链接器错误

python - 如何让 boost.python 教程与 Visual Studio 2010 和 python 3.4 一起工作?

c++ - 链接到 boost::thread 失败

c++ - 我可以在 Arduino 的库文件夹之外安装一个库吗?

c++ - FMOD 结果未被识别为有效类型?

C++ empty-paren 成员初始化 - 清零内存?

c++ - 由于无法解析模板参数导致多态性失败?

c++ - 每当成员变量可以由可变参数构造时,有条件地启用构造函数

c++ - qpThreads 文档