我试图将两个不同向量的元组作为属性传递给Spirit X3规则。一个明智的方法似乎是将它们包装在forward_as_tuple
中,因为我只想传递引用。这很好,但我必须写一个separat变量声明,然后传递它,因为非const临时生命周期规则会咬我。否则。
最后,我最终写了as_const(std::forward_as_tuple(ourBoxes, scoreVals))
之类的东西。通过制作临时const,我可以传递它。临时是 const - 因为所有元素类型都是引用,这或多或少是给定的。
这让我想知道,是否有任何设计理由使forward_as_tuple
返回类型为非const?换句话说,你怎么能有效地改变只有引用类型的元组?
修改
在下面添加了一个正确的示例。这与我想要使用X3的事实有关,并且X3中的属性类型始终是引用,因此通过值传递属性不是一个选项。更广泛的问题仍然是,forward_as_tuple
有非const返回类型是否有任何理由。
#include <boost/fusion/adapted/std_tuple.hpp>
#include <boost/fusion/adapted/std_pair.hpp>
#include <boost/spirit/home/x3.hpp>
using namespace boost::spirit;
using namespace std;
// Coming in C++ 17
template <class T>
constexpr std::add_const_t<T>& as_const(const T& t) noexcept
{
return t;
}
int main()
{
int x, y;
string readme = "42 43";
// Doesn't work
// phrase_parse(readme.begin(), readme.end(), x3::int_ > x3::int_,
// x3::space, forward_as_tuple(x, y));
// Works:
phrase_parse(readme.begin(), readme.end(), x3::int_ > x3::int_,
x3::space, as_const(forward_as_tuple(x, y)));
// Is there any reason for forward_as_tuple not returning a const?
// i.e. some use case where forward_as_tuple HAS to return a non-const for
// proper operation
}