我正在寻找使用Qt 4框架在C++中启动项目(需要跨平台的GUI).我从朋友和网上听过Boost图书馆的好消息.我已经开始阅读这两篇文章,并且在我太深入之前想问一个粗略的问题:这两个开发"系统"是否相互排斥?
我最初的搜索和阅读显示了信号处理,自定义构建系统和其他低级原语的一些重叠.
在同一个项目中使用它们是否有意义?
我正在尝试使用boost属性树创建一个JSON数组.
该文件说:"JSON数组被映射到节点的每个元素与空名称的子节点."
所以我想创建一个空名称的属性树,然后调用write_json(...)以获取数组.但是,文档没有告诉我如何创建未命名的子节点.我试过了ptree.add_child("", value),但这会产生:
Assertion `!p.empty() && "Empty path not allowed for put_child."' failed
Run Code Online (Sandbox Code Playgroud)
文档似乎没有解决这一点,至少不能以任何方式解决.有人可以帮忙吗?
我想在GCC中启用对C++ 0x的支持-std=c++0x.我并不一定需要GCC 4.5中的任何当前支持的C++ 11功能(很快就会有4.6),但我想开始习惯它们.例如,在我使用迭代器的一些地方,auto类型会很有用.
但同样,我不需要任何当前支持的功能.这里的目标是鼓励我将新标准的特征融入我的编程"词汇"中.
根据您对C++ 11支持的了解,在GCC中启用它是一个好主意,然后通过例如从使用切换boost::shared_ptr到std::shared_ptr专用来实现它,因为两者不混合?
PS:我知道这个比较不同口味的好问题,shared_ptr但是我要求在标准最终确定之前提出更高级别的建议.另一种说法是,当像GCC这样的编译器说它支持"实验性功能"时,这是否意味着我可能会在编译过程中遇到奇怪的错误,这些错误将成为主要的时间汇,并且是StackOverflow上一个神秘问题的来源?
编辑:我决定退回,std::shared_ptr因为我只是不相信它在GCC 4.5中的支持,如本问题中的示例所示.
这两者有什么区别吗?还是我的安全,以取代所有出现boost::bind的std::bind在我的代码,从而消除对加速的依赖?
我是新手std::Map.什么是boost使用类型序列化和反序列化数据的最简单方法PropertyTree.我发现了一些使用的例子,std::Map但对我来说它们很模糊.
为了防止复制类,您可以非常轻松地声明私有复制构造函数/赋值运算符.但你也可以继承boost::noncopyable.
在这种情况下使用boost有什么优点/缺点?
编译boost :: program_options的示例代码:http://svn.boost.org/svn/boost/trunk/libs/program_options/example/first.cpp
...在MacOS Lion(10.7.2)上,使用随MacPorts安装的boost-1.48.0:
$ clang++ -v
Apple clang version 3.0 (tags/Apple/clang-211.12) (based on LLVM 3.0svn)
Target: x86_64-apple-darwin11.2.0
Thread model: posix
$ clang++ -std=c++0x --stdlib=libc++ -lc++ -I/opt/local/include -L/opt/local/lib -lboost_program_options first.cpp -o first
Undefined symbols for architecture x86_64:
"boost::program_options::options_description::options_description(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int, unsigned int)", referenced from:
_main in cc-6QQcwm.o
"boost::program_options::operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, boost::program_options::options_description const&)", referenced from:
_main in cc-6QQcwm.o
"boost::program_options::abstract_variables_map::operator[](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const", referenced from:
boost::program_options::variables_map::operator[](std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const in …Run Code Online (Sandbox Code Playgroud) 这个问题的答案为什么不能用c ++ 0x模式中的libc ++来扼制这个boost :: program_options例子?陈述"你需要使用clang ++ -stdlib = libc ++重建boost."
我正在使用带有clang v3.0的MacOS Lion.如何使用clang构建Boost v1.48.0并将其与libc ++链接?
更新:我已经创建了一个user-config.jam文件,其中包含以下内容:
using clang-darwin
Run Code Online (Sandbox Code Playgroud)
...将使用clang而不是gcc构建Boost.如何链接libc ++而不是libstdc ++?
这个问题也适用于boost::function和std::tr1::function.
std::function 不相等的平等:
#include <functional>
void foo() { }
int main() {
std::function<void()> f(foo), g(foo);
bool are_equal(f == g); // Error: f and g are not equality comparable
}
Run Code Online (Sandbox Code Playgroud)
在C++ 11中,operator==和operator!=重载并不存在.在早期的C++ 11草案中,使用注释(N3092§20.8.14.2)将重载声明为已删除:
// deleted overloads close possible hole in the type system
Run Code Online (Sandbox Code Playgroud)
它没有说明"类型系统中可能存在的漏洞"是什么.在TR1和Boost中,声明了重载但未定义.TR1规范评论(N1836§3.7.2.6):
这些成员函数应保持未定义.
[ 注意:类似布尔值的转换会打开一个漏洞,通过
==或可以比较两个函数实例!=.这些未定义的void运算符会关闭漏洞并确保编译时错误.- 尾注 ]
我对"漏洞"的理解是,如果我们有bool转换函数,那么转换可以用于相等比较(以及其他情况):
struct S {
operator bool() { return false; }
};
int main() { …Run Code Online (Sandbox Code Playgroud) 假设我有一个将两个值相加的函数.如果我对类型一无所知,那么我基本上必须写两次函数; 一次在实际返回值中,再次作为返回类型说明符:
template <typename A, typename B>
auto Add(const A& a, const B& b) ->std::decay<decltype(a + b)>::type
{
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但它是不可取的,因为它难以阅读且难以维护.
在C++ 14中,这不会是一个问题,因为我们可以删除返回类型说明符(我不确定它会不会衰减...).现在,我坚持使用C++ 11.
根据我的经验,无论何时我在C++中寻找尚未进入标准的功能,但有明显的需求,Boost库通常都有一个解决方案.我搜索了文档,但是我找不到任何可能对我有帮助的东西.这些BOOST_AUTO_RETURN和BOOST_TYPEOF_TPL功能似乎更多旨在为C++ 03用户提供C++ 11功能.
基本上我所追求的是执行以下功能的东西:
template <typename A, typename B>
auto Add(const A& a, const B& b)
{
return a + b; // Deduce return type from this, like C++14 would
}
Run Code Online (Sandbox Code Playgroud)
Boost库中是否有一些我不知道的功能(或C++ 11中的一个漂亮的技巧)可能允许我-> decltype(...)在每次自动返回类型后放弃显式?这将如何实施?
boost ×10
c++ ×10
c++11 ×5
clang ×2
json ×2
libc++ ×2
boost-bind ×1
function ×1
noncopyable ×1
qt ×1
shared-ptr ×1
stdbind ×1
stl ×1
tr1 ×1