小编ACB*_*ACB的帖子

可变参数模板的模板模板参数扩展

我最近了解了模板模板参数的存在,现在想知道这样的事情是否可行:

template<template<class... > class Container, typename... args>
struct ContainerTemplate
{
    using container = std::tuple<Container<args...>...>;
};
Run Code Online (Sandbox Code Playgroud)

我想要的是一个模板,它获取一个Container或一些其他模板类作为模板模板参数,然后扩展其余的模板参数,如果Container有N个模板参数,我给args的N*M模板参数我用N模板args获得M模板实例化,例如:

ContainerTemplate<std::vector, int, short, char>
//assuming std::vector takes only 1 arg for simplicity    
Run Code Online (Sandbox Code Playgroud)

应该导致

container = std::tuple<std::vector<int>, std::vector<short>, std::vector<char>>
Run Code Online (Sandbox Code Playgroud)

ContainerTemplate<std::map, int, int, short, short>
//assuming std::map takes only 2 args for simplicity    
Run Code Online (Sandbox Code Playgroud)

应该导致

container = std::tuple<std::map<int, int>, std::map<short, short>>
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?问题是你可以找出容器有多少模板args.

编辑:如果您需要在大小为N的元组中传递其他参数,那就没问题

ContainerTemplate<std::map, std::tuple<int, int>, std::tuple<short, short>>
Run Code Online (Sandbox Code Playgroud)

Edit2:所以我实际上找到了一种确定模板模板参数数量的方法

template<typename... T>
struct TypeList
{
    static const size_t Size = sizeof...(T);
    template<typename T2>
    struct PushFront
    {
        typedef …
Run Code Online (Sandbox Code Playgroud)

c++ templates variadic c++11

11
推荐指数
3
解决办法
1353
查看次数

boost asio 协程中的 co_await 自定义等待者

我目前正在尝试将新的 C++20 协程与 boost::asio 一起使用。然而,我正在努力找出如何实现自定义可等待函数(例如 boost::asio::read_async)。我试图解决的问题如下:

我有一个连接对象,我可以在其中发出多个请求并注册响应的回调。不保证响应会按照请求的顺序到达。我尝试用自定义的可等待包装回调,但是我无法在协程中 co_await ,因为 boost::asio::awaitable 中没有适用于我的可等待类型的await_transform。

我尝试将回调包装成可等待的代码改编自此处: https://books.google.de/books ?id=tJIREAAAQBAJ&pg=PA457

auto async_request(const request& r)
{
    struct awaitable
    {
        client* cli;
        request req;
        response resp{};

        bool await_ready() { return false; }
        void await_suspend(std::coroutine_handle<> h)
        {
            cli->send(req, [this, h](const response& r)
            {
                resp = r;
                h.resume();
            });
        }
        auto await_resume()
        {
            return resp;
        }
    };
    return awaitable{this, r};
}
Run Code Online (Sandbox Code Playgroud)

我尝试调用一个 boost 协程,如下所示:

boost::asio::awaitable<void> network::sts::client::connect()
{
    //...
    auto res = co_await async_request(make_sts_connect());
    //...
}
Run Code Online (Sandbox Code Playgroud)

给我以下错误:

error C2664: 'boost::asio::detail::awaitable_frame_base<Executor>::await_transform::result boost::asio::detail::awaitable_frame_base<Executor>::await_transform(boost::asio::this_coro::executor_t) …
Run Code Online (Sandbox Code Playgroud)

c++ boost asio c++20 c++-coroutine

11
推荐指数
1
解决办法
1508
查看次数

使用未知输出文件CMake ADD_CUSTOM_COMMAND

我有一个工具来生成一些cpp和头文件,并希望使用ADD_CUSTOM_COMMAND添加它以在构建期间自动执行它并将文件添加到项目中.问题是预先不知道(大多数)输出文件的名称.我如何添加这些文件?

c++ cmake

10
推荐指数
1
解决办法
586
查看次数

线程本地人在Lua

在我的应用程序中,Lua脚本可以订阅来自客户端的某些事件.也可以让一个脚本订阅多个客户端.目前,我每次要调用脚本时都会设置全局"客户端",以便脚本可以访问进行回调的客户端.我想要的是类似于C++中的本地线程,这样我就可以为每个客户端创建一个新的Lua线程,并为该线程设置一次"Client"变量.如果客户端然后触发事件,它将只使用与之关联的线程.

TLDR:Lua中的变量是否可能只在特定的Lua线程中有效?

c++ lua

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

标签 统计

c++ ×4

asio ×1

boost ×1

c++-coroutine ×1

c++11 ×1

c++20 ×1

cmake ×1

lua ×1

templates ×1

variadic ×1