【问题标题】:boost::mpl::map of type and char stringboost::mpl::map 类型和字符字符串
【发布时间】:2015-09-27 06:50:04
【问题描述】:

类似于跟随

typedef boost::mpl::map<
      pair<int,"int">
    , pair<long,"long">
    , pair<bool,"bool">
    > m;

可能吗?如果没有,有什么替代方案?

【问题讨论】:

  • 我想你想要一个boost::fusion::map。我想在boost::mpl::pair 中使用boost::mpl:: string 作为第二个参数也可以。

标签: c++ boost boost-mpl


【解决方案1】:

如果你可以使用 C++14 编译器(目前只有 Clang >= 3.5),你可以使用Boost.Hana

#include <boost/hana.hpp>
namespace hana = boost::hana;

auto m = hana::make_map(
    hana::make_pair(hana::type_c<int>, BOOST_HANA_STRING("int")),
    hana::make_pair(hana::type_c<long>, BOOST_HANA_STRING("long")),
    hana::make_pair(hana::type_c<bool>, BOOST_HANA_STRING("bool"))
);

// These assertions are done at compile-time
BOOST_HANA_CONSTANT_ASSERT(m[hana::type_c<int>] == BOOST_HANA_STRING("int"));
BOOST_HANA_CONSTANT_ASSERT(m[hana::type_c<long>] == BOOST_HANA_STRING("long"));
BOOST_HANA_CONSTANT_ASSERT(m[hana::type_c<bool>] == BOOST_HANA_STRING("bool"));

如果您还愿意使用 Clang 和 GCC 支持(至少)的非标准 GNU 扩展,您甚至可以执行以下操作并删除丑陋的 BOOST_HANA_STRING 宏:

#define BOOST_HANA_CONFIG_ENABLE_STRING_UDL

#include <boost/hana.hpp>
namespace hana = boost::hana;
using namespace hana::literals;

constexpr auto m = hana::make_map(
    hana::make_pair(hana::type_c<int>, "int"_s),
    hana::make_pair(hana::type_c<long>, "long"_s),
    hana::make_pair(hana::type_c<bool>, "bool"_s)
);

static_assert(m[hana::type_c<int>] == "int"_s, "");
static_assert(m[hana::type_c<long>] == "long"_s, "");
static_assert(m[hana::type_c<bool>] == "bool"_s, "");

【讨论】:

    猜你喜欢
    • 2014-12-24
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多