- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我试图访问我的业力语法中的指针 vector ,但收效甚微。指针类型是不可复制的,因此使用它的规则必须采用引用:
#include <boost/spirit/include/karma.hpp>
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
namespace karma = boost::spirit::karma;
namespace fusion = boost::fusion;
namespace phx = boost::phoenix;
struct test1 : boost::noncopyable {
test1(int i = 0) : value(i) {}
int value;
};
struct test2 : boost::noncopyable {
int value;
std::vector<test1*> vector;
};
BOOST_FUSION_ADAPT_STRUCT( test1, (int, value) );
BOOST_FUSION_ADAPT_STRUCT( test2, (int, value) (std::vector<test1*>, vector) );
typedef std::ostream_iterator<char> Iterator;
int main() {
karma::rule<Iterator, test1*()> t1r;
karma::rule<Iterator, test2&()> t2r;
t2r %= "test 2 rule:" << karma::int_ << karma::eol << (t1r % karma::eol);
t1r %= "test 1 rule: " << karma::int_;
std::stringstream stream;
std::ostream_iterator<char> out(stream);
test2 t;
t.vector.push_back(new test1(2));
t.vector.push_back(new test1(3));
t.vector.push_back(new test1(4));
t.vector.push_back(new test1(5));
t.value = 1;
karma::generate(out, t2r, t);
std::cout<<stream.str()<<std::endl;
}
此编译但返回:测试 2 规则:1,测试 1 规则:25104656,测试 1 规则:25104720 等等。我知道在这种简单的情况下我可以做到
t1r = "test 1 rule: " << karma::int_[karma::_1 = phx::bind(&test1::value, *karma::_val)];
来解决它,但实际上 value 是另一种不可复制的类型,它应该被传递给语法,因此我需要像示例中那样使用结构适配。
我也知道提到的自定义点 deref_iterator here ,但是,我在模板库上工作,并且认为不可能将 deref_iterator 专门化为模板相关类型。
关于如何使示例工作的任何想法?
最佳答案
llonesmiz 在评论中回答了我的问题,因此我发布了他的内部信息以供将来引用。使用自定义点transform属性问题可以这样解决:
#include <boost/spirit/include/karma.hpp>
#include <boost/fusion/adapted/struct/adapt_struct.hpp>
#include <boost/fusion/include/adapt_struct.hpp>
namespace karma = boost::spirit::karma;
namespace fusion = boost::fusion;
namespace phx = boost::phoenix;
template <typename Value1, typename Value2>
struct test1 : boost::noncopyable {
test1(Value1 i = Value1(), Value2 j = Value2() ): value1(i),value2(j) {}
Value1 value1;
Value2 value2;
};
struct test2 : boost::noncopyable {
int value;
std::vector<test1<int,double>*> vector;
};
BOOST_FUSION_ADAPT_TPL_STRUCT(
(Value1)(Value2),
(test1) (Value1)(Value2),
(Value1, value1)
(Value2, value2))
typedef std::vector<test1<int,double>*> test1_vector;
BOOST_FUSION_ADAPT_STRUCT( test2, (int, value) (test1_vector, vector) )
typedef std::ostream_iterator<char> Iterator;
namespace boost { namespace spirit { namespace traits
{
template <typename Value1, typename Value2>
struct transform_attribute<test1<Value1,Value2>* const, test1<Value1,Value2>&, karma::domain>
{
typedef test1<Value1,Value2>& type;
static type pre(test1<Value1,Value2>* const& val)
{
return *val;
}
};
}}}
int main() {
karma::rule<Iterator, test1<int,double>*()> t1r;
karma::rule<Iterator, test2&()> t2r;
t2r %= "test 2 rule:" << karma::int_ << karma::eol << (t1r % karma::eol);
t1r %= "test 1 rule: " << karma::attr_cast<test1<int,double>*,test1<int,double>&>(karma::delimit(karma::space)[karma::int_<< karma::double_]);
std::stringstream stream;
std::ostream_iterator<char> out(stream);
test2 t;
t.vector.push_back(new test1<int,double>(2));
t.vector.push_back(new test1<int,double>(3));
t.vector.push_back(new test1<int,double>(4));
t.vector.push_back(new test1<int,double>(5));
t.value = 1;
karma::generate(out, t2r, t);
std::cout<<stream.str()<<std::endl;
}
关于c++ - spirit 业力: access noncopyable pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15450230/
我的代码无法编译。我究竟做错了什么?我还希望 sf::Window 和 sf::Input 对象是静态字段。解决此问题的最佳方法是什么? #include #include #ifndef WIN
当我尝试编译以下代码时: SFMLSet.cpp: #include "SFMLSet.h" SFMLSet::SFMLSet(string texturePath) { if(!textur
我意识到这可能是重复的,但我搜索了许多论坛和问题,知道是什么原因导致了问题,但无法在此处找到它。我正在使用 SFML 2.0,我已将错误追踪到: void GameObjectManager::Dra
我找不到解决代码中此错误的方法,在谷歌搜索并检查源代码后,我找不到解决它的方法。 错误: Error 1 error C2248: 'sf::NonCopyable::NonCopyable'
我想在 SFML 库中创建简单的形状,但我不知道如何在多个文件中共享项目。我知道必须看起来像,但我想知道为什么这不起作用 主文件: #include #include #include "Bal
我需要一个 noncopyable 类,它有一个声明的析构函数,天真的方法不起作用:参见 https://ideone.com/mU8aoc .析构函数有什么问题,为什么 move 与没有析构函数的方
首先:它是 boost::noncopyable 还是 booster::noncopyable。我在不同的地方都见过。 为什么要让一个类不可复制?能否提供一些示例用例? 最佳答案 只要你有一个类有一
要防止复制一个类,您可以很容易地声明一个私有(private)复制构造函数/赋值运算符。但您也可以继承 boost::noncopyable。 在这种情况下使用 boost 的优点/缺点是什么? 最佳
我在 C++ 实践中偶然发现了 2 个愚蠢的问题: C++ 中的 AFAIK 复制构造函数和赋值运算符不是继承的...那么在这种情况下 boost::noncopyable 如何帮助禁止这些东西? c
为了防止复制一个类,你可以很容易地声明一个私有(private)的复制构造函数/赋值操作符。但是你也可以继承boost::noncopyable。 在这种情况下使用 boost 有什么优点/缺点? 最
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: What are the advantages of boost::noncopyable 为什么有 boo
与Boost.Asio的殊死搏斗,遇到了很多困难。 其中之一是我几乎无法定位“boost::noncopyable 错误”所在的位置! 如果我不小心违反了不可复制的规定,IDE 只会在 noncopy
我对以下代码有疑问: class MyClass : private boost::noncopyable { public: MyClass() {} virtual ~My
首先,我在我的 Windows 机器上运行了完全相同的代码,而且我不经常使用 Linux,所以我尝试编译它的方式可能存在问题。我将不胜感激任何帮助找出我遇到的错误,因为我不确定是什么原因造成的,并且通
有一个 boost::noncopyable我的图书馆里有我自己的不可复制的类。在最新的 C++ 标准中是否存在 std::noncopyable 或等效项? 这是一件小事,但从这样一个类派生出来的意
将任何不可复制的成员添加到类将阻止自动生成复制构造和赋值运算符。为什么 boost 需要继承才能使用不可复制? 我认为我对 的风格偏好并不孤单 class MyUtility : public MyB
可以通过继承 boost::noncopyable_::noncopyable 快速使类型不可复制。是否有类似的方法来防止类型可移动? 最佳答案 如果声明了复制构造函数而不是移动构造函数,则不会生成移
我试图访问我的业力语法中的指针 vector ,但收效甚微。指针类型是不可复制的,因此使用它的规则必须采用引用: #include #include #include namespace kar
更新 下面提到的错误在 VS2012 中得到修复,并且 noncopyable 可以正常工作 这既是一个问题,也是一种提供信息/警告他人的方式,这样他们就不会像我一样陷入同样的陷阱:似乎使用 no
假设我需要实现返回对象 O 的工厂函数,该对象继承/具有继承自 boost::noncopyable 的成员。 struct O : boost::noncopyable {}; O factory(
我是一名优秀的程序员,十分优秀!