我是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> M
内Foo
和BOOST_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
});
已经转换为“,”。有些人建议使用括号来封装类型。但这在这里不起作用,因为这需要宏来处理括号并提取类型。 (我真的不熟悉宏,所以如果我错了请告诉我)
任何帮助将不胜感激!非常感谢你。
答案 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)
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^ ~^^~
)