带模板成员的BOOST_FUSION_ADAPT_TPL_STRUCT

时间:2015-11-04 11:57:02

标签: c++ templates boost macros boost-fusion

我是StackOverflow的新手,也是c ++编写宏的新手,如果这个问题太天真,请原谅我。

我写了一个这样的模板类:

    template<typename T, typename U>
    class Foo
    {
    public:
      unsigned n;
      std::string s;
      std::map<T,U> m;
    }

我希望使用BOOST_FUSION_ADAPT_TPL_STRUCT进行融合:

    BOOST_FUSION_ADAPT_TPL_STRUCT
    (
      (T)(U),
      (FOO)(T)(U),
      (unsigned, n),
      (std::string, s),
      (std::map<T,U>, m)
    )

我知道这不起作用,因为map<T,U>内的逗号会造成麻烦。如果我的班级不是模板班,我可以在typedef std::map<T,U> MFooBOOST_FUSION_ADAPT_STRUCT(Foo::M, m)Foo。但是,由于#define COMMA ,是模板类,我不知道如何使其工作。

我在网上看到有一些技巧可以阻止逗号在宏中被视为分隔符。例如,有些人使用COMMA并在std::map<T COMMA U>中使用COMMA。然而,这在这里不起作用。我不是很确定,但我认为在通过BOOST_FUSION_ADAPT_TPL_STRUCT调用的其他BOOST宏之前 $(document).ready(function () { $("#drdCriterias").change(function () { var table = document.getElementById("tableCriterias"); var row = table.insertRow(-1); var cell1 = row.insertCell(0); var cell2 = row.insertCell(1); var cell3 = row.insertCell(2); cell1.innerHTML = $('#drdCriterias').val(); cell2.innerHTML = $('#drdCriterias :selected').text(); cell3.innerHTML = '<button type="button" class="ups"><span class="glyphicon glyphicon-circle-arrow-up"></span></button>'; }); $("tr .ups").click(function () { alert("Hi"); //nothing happens }); 已经转换为“,”。有些人建议使用括号来封装类型。但这在这里不起作用,因为这需要宏来处理括号并提取类型。 (我真的不熟悉宏,所以如果我错了请告诉我)

任何帮助将不胜感激!非常感谢你。

1 个答案:

答案 0 :(得分:1)

#include <boost/utility/identity_type.hpp>

BOOST_FUSION_ADAPT_TPL_STRUCT
(
  (T)(U),
  (Foo)(T)(U),
  (unsigned, n),
  (std::string, s),
  (typename BOOST_IDENTITY_TYPE((std::map<T,U>)), m)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^            ~^^~  
)

DEMO