小编coy*_*508的帖子

何时使用std :: forward来转发参数?

C++ 0x显示了一个使用示例std::forward:

template<class T>
void foo(T&& arg) 
{
  bar(std::forward<T>(arg));
}
Run Code Online (Sandbox Code Playgroud)

什么时候使用它std::forward总是有利的?

另外,它需要&&在参数声明中使用,它在所有情况下都有效吗?如果函数在其中声明,我认为你必须将临时函数传递给函数&&,那么可以使用任何参数调用foo吗?

最后,如果我有一个函数调用,如下所示:

template<int val, typename... Params>
void doSomething(Params... args) {
  doSomethingElse<val, Params...>(args...);
}
Run Code Online (Sandbox Code Playgroud)

我应该用它代替:

template<int val, typename... Params>
void doSomething(Params&&... args) {
  doSomethingElse<val, Params...>(std::forward<Params>(args)...);
}
Run Code Online (Sandbox Code Playgroud)

另外,如果在函数中使用两次参数,即同时转发到两个函数,是否明智使用std::forward?不会std::forward将相同的东西转换为临时两次,移动内存并使其无效以供第二次使用?以下代码是否可以:

template<int val, typename... Params>
void doSomething(Params&&... args) {
  doSomethingElse<val, Params...>(std::forward<Params>(args)...);
  doSomethingWeird<val, Params...>(std::forward<Params>(args)...);
}
Run Code Online (Sandbox Code Playgroud)

我有点困惑std::forward,我很乐意使用一些清理工作.

c++ templates forwarding c++11

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

调用const函数而不是非const版本

我试图为我的目的包装类似于Qt的共享数据指针的东西,并且经过测试我发现当应该调用const函数时,选择了它的非const版本.

我正在使用C++ 0x选项进行编译,这里是一个最小的代码:

struct Data {
    int x() const {
        return 1;
    }
};

template <class T>
struct container
{
    container() {
        ptr = new T();
    }


    T & operator*() {
        puts("non const data ptr");
        return *ptr;
    }

    T * operator->() {
        puts("non const data ptr");
        return ptr;
    }

    const T & operator*() const {
        puts("const data ptr");
        return *ptr;
    }

    const T * operator->() const {
        puts("const data ptr");
        return ptr;
    }

    T* ptr;
};

typedef container<Data> testType;

void …
Run Code Online (Sandbox Code Playgroud)

c++ const

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

使用可变参数模板的模板专业化

template <size_t size, typename ...Params>
void doStuff(Params...) {
}

template <>
void doStuff<size_t(1), int, bool>(int, bool) {

}

int main(int, char**) {
    doStuff<1,int,bool>(1, false);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这不会编译,第二个doStuff声明给了我,error: template-id ‘doStuff<1u, int, bool>’ for ‘void doStuff(int, bool)’ does not match any template declaration但它明确地将第一个声明与variadic模板参数匹配.

如何专门研究可变参数模板?

c++ templates template-specialization variadic-templates c++11

19
推荐指数
1
解决办法
5879
查看次数

基本类型的安置值得吗?

假设我有一个map<int, int>:

std::map<int, int> map;

map.emplace(1, 2);
map.insert({3, 4});
Run Code Online (Sandbox Code Playgroud)

这两个电话会有什么不同吗?

在第一次调用中,两个整数将按值复制到emplace函数,然后再复制到std::pair<int, int>构造函数.在第二次调用中,两个整数将按值复制到std::pair<int, int>构造函数,然后std::pair<int, int> 再作为第一对的成员按值复制到内部.

我理解emplace对于类型的好处,比如std::string它们会在第二次调用中被值复制并在第一次调用中一直移动,但emplace在描述的情况下使用是否有任何好处?

c++ containers c++14

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

是否可以在打字稿中重用泛型类型?

我想做这样的事情:

namepace Namespace<S,T,U,V> {
  type A = doSomething(S, T, U, V);
  type B<X> = doSomethingB(type<A>, V, X);

  interface I<X, Y> {
     a: A;
     b: B<X>
  }
}
Run Code Online (Sandbox Code Playgroud)

基本上我想重用通用参数而不是每次都重复它们。我不想做类似的事情:

type A<S, T, U, V> = doSomething(S, T, U, V);
type B<S, T, U, V, X> = doSomething(A<S, T, U, V>, V, X);

interface I<S, T, U, V, X> {
  a: A<S, T, U, V>;
  b: A<S, T, U, V, X>;
}
Run Code Online (Sandbox Code Playgroud)

另一种描述方式相当于typedefC++ 中的嵌套:

template <typename T>
class Abc<T> { …
Run Code Online (Sandbox Code Playgroud)

typescript typescript-generics

7
推荐指数
0
解决办法
1953
查看次数

使用子类作为基类的模板参数和嵌套名称说明符

我正在使用我的类作为其父类之一的模板参数,并且该父类在模板参数中使用它(尽管sizeof()).

编译器给了我:

错误:在嵌套名称说明符中使用的不完整类型'Invoker :: workerClass {aka MyClass}'

然而,该类在文件中定义良好.我想这是因为子类在基类实例化时没有实例化,但是CRTP会发生这种情况并且没有问题.

我在模板参数中使用子类的原因是,如果子类具有或没有特定的函数,则执行不同的函数调用.

这是一个最小的测试代码

/* Structure similar to boost's enable if, to use
  SFINAE */
template <int X=0, class U = void>
struct test {
    typedef U type;
};

enum Commands {
    Swim,
    Fly
};

/* Structure used for template overloading,
  as no partial function template specialization available */
template<Commands T>
struct Param {

};

template <class T>
class Invoker
{
public:
    typedef T workerClass;

    workerClass *wc() {
        return static_cast<workerClass*>(this);
    }

    template …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11

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

在archlinux上安装boost devel

我在archlinux上配置了一个远程服务器,我需要安装boost库的dev版本才能编译我的程序,更具体地说<boost/asio.hpp>.

我试过sudo pacman -S boost-libs,它安装了一些东西,但没有安装devel文件,我也试过sudo pacman -S boost-libs-dev,但它没有用.

谢谢

c++ boost archlinux

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

javascript对象的元素是按特定顺序初始化的吗?

我有这样的功能:

parsers[1] = function(buf) {
    return {
        type: "init",
        name: buf.readUTF8String(),
        capacity: buf.readUInt32(),
        port: buf.readUInt16()
    };
}
Run Code Online (Sandbox Code Playgroud)

难道我有什么保证name,capacityport将被初始化一个接一个?否则,将以错误的顺序读取缓冲区.

我当然可以依靠:

parsers[1] = function(buf) {
    var ret = {type: "init"};
    ret.name = buf.readUTF8String();
    ret.capacity = buf.readUInt32();
    ret.port = buf.readUInt16();

    return ret;
}
Run Code Online (Sandbox Code Playgroud)

javascript object node.js

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

如何交换qml网格中的元素?

我试过了 :

var child = grid.children[slot1];
grid.children[slot1] = grid.children[slot2];
grid.children[slot2] = child;
Run Code Online (Sandbox Code Playgroud)

但它没有用.

将元素重新显示到网格(element.parent = grid)时,它会被有效添加,但无法对它们进行排序.

我应该使用自己的QML小部件吗?

qml

4
推荐指数
1
解决办法
2084
查看次数

访问被杀死的Docker容器的日志

由于过去的Docker容器占用了空间,最近我不得不清理我的完整磁盘。因此,我假设我可以访问已终止容器的日志。

例如,我有一个容器的docker历史记录:

$ docker history xxx_app
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
d7cfe17fc42a        56 minutes ago      /bin/sh -c #(nop)  EXPOSE 3000/tcp              0 B                 
cd26ca1108f0        56 minutes ago      /bin/sh -c #(nop) COPY dir:8daa84a931569267ab   62.27 MB            
6fa873fcc7bb        9 days ago          /bin/sh -c npm install && npm cache clean       177.8 MB            
67a23b0934d8        9 days ago          /bin/sh -c #(nop) COPY file:5dcb2a83410d0aa7f   1.529 kB            
3b7197885c91        3 weeks ago         /bin/sh -c #(nop)  ENV NODE_ENV=                0 B                 
79a447242ea5        3 weeks ago         /bin/sh -c #(nop)  ARG NODE_ENV                 0 …
Run Code Online (Sandbox Code Playgroud)

logging docker

4
推荐指数
2
解决办法
7825
查看次数

使用NodeJS中的UDP将多个客户端连接到同一服务器

同一台UDP服务器上可以有多个客户端吗?我想向所有连接的客户端广播相同的数据。

如果可以帮助的话,这将是一个初始示例...

// Server
var news = [
  "Borussia Dortmund wins German championship",
  "Tornado warning for the Bay Area",
  "More rain for the weekend"
];

var dgram = require('dgram');
var server = dgram.createSocket("udp4");
server.bind(function() {
  server.setBroadcast(true)
  server.setMulticastTTL(128);
  setInterval(broadcastNew, 3000);
});

function broadcastNew() {
  var message = new Buffer(news[Math.floor(Math.random() * news.length)]);
  server.send(message, 0, message.length, 5007, "224.1.1.1");
  console.log("Sent " + message + " to the wire...");
}

// Client 1
var PORT = 5007;
var dgram = require('dgram');
var client = dgram.createSocket('udp4'); …
Run Code Online (Sandbox Code Playgroud)

javascript udp node.js

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

发送UDP广播后接收响应

我遇到了广播问题:我可以发送消息,接收者接收并发送回,但我无法得到这些响应。不过,它显示在wireshark 上,所以它就在那里。

这是我在发件人端所做的:

  • 创建套接字
  • 将广播选项设置为 1
  • 设置为非阻塞
  • 使用连接将其设置为目标端口和广播 IP
  • 发送消息
  • 使用 recv() 继续接收以获取响应

但是我没有在那个 recv 中得到响应,即使它显示在 Wireshark 上并且它没有被计算机拒绝(没有 ICMP 消息)。

这个过程有什么问题,还是我看的地方不对?

(顺便说一句,当不使用广播选项和目标 IP 时,它工作正常)

c sockets udp broadcast winsock2

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