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,我很乐意使用一些清理工作.
我试图为我的目的包装类似于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) 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
假设我有一个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在描述的情况下使用是否有任何好处?
我想做这样的事情:
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) 我正在使用我的类作为其父类之一的模板参数,并且该父类在模板参数中使用它(尽管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) 我在archlinux上配置了一个远程服务器,我需要安装boost库的dev版本才能编译我的程序,更具体地说<boost/asio.hpp>.
我试过sudo pacman -S boost-libs,它安装了一些东西,但没有安装devel文件,我也试过sudo pacman -S boost-libs-dev,但它没有用.
谢谢
我有这样的功能:
parsers[1] = function(buf) {
return {
type: "init",
name: buf.readUTF8String(),
capacity: buf.readUInt32(),
port: buf.readUInt16()
};
}
Run Code Online (Sandbox Code Playgroud)
难道我有什么保证name,capacity和port将被初始化一个接一个?否则,将以错误的顺序读取缓冲区.
我当然可以依靠:
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) 我试过了 :
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小部件吗?
由于过去的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) 同一台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) 我遇到了广播问题:我可以发送消息,接收者接收并发送回,但我无法得到这些响应。不过,它显示在wireshark 上,所以它就在那里。
这是我在发件人端所做的:
但是我没有在那个 recv 中得到响应,即使它显示在 Wireshark 上并且它没有被计算机拒绝(没有 ICMP 消息)。
这个过程有什么问题,还是我看的地方不对?
(顺便说一句,当不使用广播选项和目标 IP 时,它工作正常)