在使用C++ 11的线程模型时,我注意到了这一点
std::packaged_task<int(int,int)> task([](int a, int b) { return a + b; });
auto f = task.get_future();
task(2,3);
std::cout << f.get() << '\n';
Run Code Online (Sandbox Code Playgroud)
和
auto f = std::async(std::launch::async,
[](int a, int b) { return a + b; }, 2, 3);
std::cout << f.get() << '\n';
Run Code Online (Sandbox Code Playgroud)
似乎做了完全相同的事情.据我所知,有可能是一个重大的区别,如果我跑std::async带std::launch::deferred,但有一个在这种情况下?
这两种方法有什么区别,更重要的是,我应该使用哪种用例?
我有一个资源管理器,像Andrei Alexandrescu在Modern C++ Design一书中提出的那样,遵循基于策略的设计.我遇到了麻烦,因为我的资源管理器需要能够通过提供对托管资源的引用shared_from_this().
我建立了一个简单的例子来重现我的问题,结果你可以在这里看到.
基本上我有一些需要对其经理的引用的托管资源:
template <typename T>
class managed_resource
{
typedef std::shared_ptr<manager<T>> manager_ptr;
public:
managed_resource(manager_ptr const & parent)
: parent_(parent)
{
}
/* ... */
private:
manager_ptr parent_;
};
Run Code Online (Sandbox Code Playgroud)
以及存储和提供资源的经理:
template <typename Policy>
class manager
: Policy
, std::enable_shared_from_this<manager<Policy>>
{
typedef managed_resource<Policy> resource;
typedef std::shared_ptr<resource> resource_ptr;
public:
resource_ptr get_resource(std::string const & name)
{
Policy & p = *this;
if(p.find(name))
{
return p.get(name);
}
resource_ptr res = std::make_shared<resource>(shared_from_this());
p.store(name, res);
return res;
}
};
Run Code Online (Sandbox Code Playgroud)
如您所见,存储本身是基于策略的.虽然管理者确实创建了资源,但策略可以在存储信息的各种方法之间自由决定(例如,它可以选择不存储任何东西并且每次都创建新资源). …
我想使用UDP广播到本地网络中的所有计算机boost::asio.通过实例我想出了
try {
socket.open(boost::asio::ip::udp::v4());
boost::asio::socket_base::broadcast option(true);
socket.set_option(option);
endpoint = boost::asio::ip::udp::endpoint(
boost::asio::ip::address::from_string("192.168.1.255"),
port);
}
catch(std::exception &e) {
}
Run Code Online (Sandbox Code Playgroud)
并希望用我的队列广播消息
while(!queue.empty()) {
std::string message = queue.front();
boost::system::error_code ignored_error;
socket.send_to(
boost::asio::buffer(message),
endpoint,
0, ignored_error);
queue.pop_front();
}
Run Code Online (Sandbox Code Playgroud)
但是我的代码invalid argument在第一个代码块中引发异常异常.127.0.0.1虽然它工作正常.我究竟做错了什么?
我是Symfony 2 Web框架的新手,我正在努力完成一项非常基本的验证任务.我有一个Post有成员的实体模型,slug我用它来构建帖子的链接.在Post.orm.yml我定义unique: true并希望将此约束包括为验证器.
我创建了一个文件validation.yml:
# src/OwnBundles/BlogpostBundle/Resources/config/validation.yml
OwnBundles\BlogpostBundle\Entity\Post:
properties:
slug:
- NotBlank: ~
constraints:
- Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: slug
Run Code Online (Sandbox Code Playgroud)
我的控制器中的创建功能非常简单:
public function addAction(Request $request)
{
$post = new Post();
$form = $this->createForm(new PostType(), $post);
if($request->getMethod() == 'POST')
{
$form->bind($request);
if($form->isValid())
{
$em = $this->getDoctrine()->getManager();
$em->persist($post);
$em->flush();
return $this->redirect(
$this->generateUrl('own_bundles_blogpost_homepage')
);
}
}
return $this->render(
'OwnBundlesBlogpostBundle:Default:add.html.twig',
array(
'title' => 'Add new blogpost',
'form' => $form->createView(),
)
);
}
Run Code Online (Sandbox Code Playgroud)
基本页面流程工作正常,我可以添加帖子并查看它们,但如果我复制帖子标题来测试我的验证,它会引发异常:SQLSTATE[23000]: Integrity constraint violation: …
我正在开发一个使用Django作为后端的网站,我想让客户使用管理界面添加新页面 - 所以他输入了一个页面标题,一个用于更好网址的页面别名,并选择他是否想要静态内容或基于文章的结构.
我的方法如下:我创建了一个名为app的应用程序sitemanager,它包含上面描述的页面模型,以及一个上下文处理器,它将页面添加到我的模板上下文中(用于菜单等),这样可以正常工作.
当然,我还需要将它挂钩到我的url文件中,但这里是麻烦开始的地方:我可以,感谢Django的pythonic结构,检索内部的Page模型urls.py,并相应地生成我的url模式,它确实显示,但Django似乎缓存了该文件(通常很有意义),因此只有在服务器重启后才会进行更改.这显然是不可接受的.
我的第一个想法是以某种方式使管理员应用程序重置url缓存,如果添加或删除新页面,或修改别名(并且只有那时,因为缓存通常是一件好事),但我不知道如何开始那里.
或者也许还有一个我目前没有看到的更简单的解决方案?
我urls.py看起来的相关部分基本上是这样的:
from sitemanager.models import Page
static_pages = Page.objects.filter(static=True)
article_pages = Page.objects.filter(static=False)
for page in static_pages:
pattern = r'^/'+page.alias+'/$'
urlpatterns += patterns('',
url(pattern, 'views.static_page',
{ 'active': page }
)
)
# Pretty much the same for the article pages,
# but with includes of another app
Run Code Online (Sandbox Code Playgroud)
我希望在我的头脑中删除代码时,我没有犯过太多错误!
据我所知,SFINAE意味着替换失败不会导致编译错误,只是从可能的重载列表中删除原型.
我不明白:为什么这个SFINAE:
template <bool C, typename T = void> struct enable_if{};
template <typename T> struct enable_if<true, T> { typedef T type; };
Run Code Online (Sandbox Code Playgroud)
但这不是吗?
template <bool C> struct assert;
template <> struct assert<true>{};
Run Code Online (Sandbox Code Playgroud)
根据我的理解,这里的基本逻辑是相同的.这个问题来自对这个答案的评论.
在C++ 11中,要确定某个类是否具有成员函数size,您可以定义以下测试助手:
template <typename T>
struct has_size_fn
{
typedef char (& yes)[1];
typedef char (& no)[2];
template <typename C> static yes check(decltype(&C::size));
template <typename> static no check(...);
static bool const value = sizeof(check<T>(0)) == sizeof(yes);
};
Run Code Online (Sandbox Code Playgroud)
是否有类似的技巧在C++ 98中执行此操作而不依赖于编译器扩展,例如typeof?
来自cppreference的此页面提到std::hash了专门用于std::optional但未指定对象脱离时的行为的页面.我可以想到不同的行为:
std::bad_optional_access,与之相符std::optional::valuestd::optional<T>脱离对象返回相同的哈希值,这样2个脱离对象将具有相同的哈希值.std::optional<std::hash<std::optional<T>>>我最近一直在玩C++ 11,并提出了以下sum函数:
template <typename T>
inline T sum(const std::function<T (int)> &f, int initial, int end)
{
T retval = 0;
for(int k = initial; k <= end; k++) {
retval += f(k);
}
return retval;
}
Run Code Online (Sandbox Code Playgroud)
我的想法是,我可以传递一个lambda函数,因此对数学和有一个整洁可读的函数.然后我尝试了以下内容:
int main()
{
std::array<double, 2> arr1 = {{ 0.5, 1.5 }},
arr2 = {{ 1.5, -0.5 }};
auto n = sum<int>([&](int k) { return arr1[k]*arr2[k]; }, // Precision loss!
0, 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用g ++ 4.6.3编译了这个:g++ -Wall -pedantic -std=c++0x -o test …
我整天都在使用Boost :: Signals2库从代码部分中获取编译器错误.我已经将我想要做的事情简化为一个最小的例子:
#include <boost/signals2.hpp>
int foo();
struct first_nonzero
{
using result_type = int;
template <typename It>
result_type operator()(It first, It last) const
{
while(first != last)
{
if(*first != 0)
{
return *first;
}
}
return 0;
}
};
int foo()
{
using signal = boost::signals2::signal<int (), first_nonzero>;
signal s;
return s();
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译此代码段时
clang -o foo.o -c foo.cpp -std=c++11 -Weverything -Wno-c++98-compat
Run Code Online (Sandbox Code Playgroud)
我得到一个模板推导错误,似乎来自信号库本身:
In file included from foo.cpp:1:
In file included from /usr/include/boost/signals2.hpp:19:
In file included from /usr/include/boost/signals2/signal.hpp:38:
In …Run Code Online (Sandbox Code Playgroud)