小编nij*_*sen的帖子

packaged_task和async有什么区别

在使用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::asyncstd::launch::deferred,但有一个在这种情况下?

这两种方法有什么区别,更重要的是,我应该使用哪种用例?

c++ multithreading packaged-task c++11 stdasync

120
推荐指数
2
解决办法
2万
查看次数

在模板化类中使用shared_from_this

我有一个资源管理器,像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)

如您所见,存储本身是基于策略的.虽然管理者确实创建了资源,但策略可以在存储信息的各种方法之间自由决定(例如,它可以选择不存储任何东西并且每次都创建新资源). …

c++ templates shared-ptr c++11

21
推荐指数
1
解决办法
8863
查看次数

boost :: asio UDP广播

我想使用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虽然它工作正常.我究竟做错了什么?

c++ boost udp broadcast boost-asio

17
推荐指数
1
解决办法
2万
查看次数

YML验证文件被忽略

我是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: …

php validation yaml symfony

16
推荐指数
1
解决办法
9330
查看次数

Django动态网址

我正在开发一个使用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)

我希望在我的头脑中删除代码时,我没有犯过太多错误!

python django django-urls

13
推荐指数
1
解决办法
2万
查看次数

了解SFINAE

据我所知,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++ templates sfinae c++11 argument-deduction

13
推荐指数
1
解决办法
2770
查看次数

使用SFINAE检测成员函数

在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

c++ sfinae c++98

9
推荐指数
1
解决办法
1万
查看次数

脱离的std :: optional <T>对象的哈希是什么?

来自cppreference的此页面提到std::hash了专门用于std::optional但未指定对象脱离时的行为的页面.我可以想到不同的行为:

  • 它可以抛出一个std::bad_optional_access,与之相符std::optional::value
  • 它可以为每个std::optional<T>脱离对象返回相同的哈希值,这样2个脱离对象将具有相同的哈希值.
  • 它可以返回一个 std::optional<std::hash<std::optional<T>>>

c++ hash standard-library optional c++14

7
推荐指数
1
解决办法
592
查看次数

编译器没有警告精度损失?

我最近一直在玩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 …

c++ g++ compiler-warnings c++11

6
推荐指数
1
解决办法
815
查看次数

clang不喜欢boost :: signals2?

我整天都在使用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)

c++ boost clang boost-signals2 c++11

6
推荐指数
1
解决办法
480
查看次数