小编Ste*_*hen的帖子

可以使用模板按名称访问struct变量吗?

我们假设我有一个这样的结构:

struct my_struct
{
  int a;
  int b; 
}
Run Code Online (Sandbox Code Playgroud)

我有一个函数应该为"a"或"b"设置一个新值.此函数还需要指定要设置的变量.一个典型的例子是这样的:

void f(int which, my_struct* s, int new_value)
{
  if(which == 0)
     s->a = new_value;
  else
     s->b = new_value; 
}
Run Code Online (Sandbox Code Playgroud)

由于我不会在这里写的原因,我无法将指针传递给a/b到f.所以我不能用my_struct :: a或my_struct :: b的地址调用f.我不能做的另一件事是在my_struct中声明一个向量(int vars [2])并将一个整数作为索引传递给f.基本上在f中我需要按名称访问变量.

以前的例子的问题是,在将来我计划向struct添加更多变量,在这种情况下,我将记得向f添加更多if语句,这对于可移植性是不利的.我能做的就是将f写为宏,如下所示:

#define FUNC(which)
void f(my_struct* s, int new_value) \
{ \
        s->which = new_value; \
} 
Run Code Online (Sandbox Code Playgroud)

然后我可以调用FUNC(a)或FUNC(b).

这可行,但我不喜欢使用宏.所以我的问题是:有没有办法使用模板而不是宏来实现相同的目标?

编辑:我将尝试解释为什么我不能使用指针,我需要按名称访问变量.基本上,结构包含系统的状态.该系统需要在请求时"撤消"其状态.使用名为undo_token的接口处理撤消,如下所示:

class undo_token
{
public:
   void undo(my_struct* s) = 0;
};
Run Code Online (Sandbox Code Playgroud)

因此,由于多态性,我无法将指针传递给undo方法(mystruct也包含其他类型的变量).

当我向结构中添加一个新变量时,我通常还会添加一个新类,如下所示:

class undo_a : public undo_token
{
  int new_value;
public:
  undo_a(int new_value) { …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

需要按插入顺序设置STL

如何以插入顺序存储集合中的元素.例如.

set<string>myset;

myset.insert("stack");
myset.insert("overflow");
Run Code Online (Sandbox Code Playgroud)

如果你打印,输出是

overflow
stack
Run Code Online (Sandbox Code Playgroud)

需要的输出:

stack
overflow
Run Code Online (Sandbox Code Playgroud)

c++ stl set

12
推荐指数
3
解决办法
5294
查看次数

Java 9 Collectors.flatMapping在Java 8中重写

我接触到了一个新功能,因为被称为Collectors.flatMapping分组或分区的下游.如(例子来自这里):

List<List<Integer>> list = Arrays.asList(
    Arrays.asList(1, 2, 3, 4, 5, 6), 
    Arrays.asList(7, 8, 9, 10));

Map<Integer, List<Integer>> map =list.stream()
    .collect(Collectors.groupingBy(
         Collection::size,
         Collectors.flatMapping(
             l -> l.stream().filter(i -> i % 2 == 0),
             Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)

{4 = [8,10],6 = [2,4,6]}

这是一个相当优雅的方式,只使用3个收藏家.我需要在中重写收集器,但尚不支持.我尝试使用6种收集器,这种收集器使用起来 非常广泛,我无法找到使用较少的收集器的方法:

Map<Integer, List<Integer>> map = list.stream()
    .collect(Collectors.groupingBy(
        Collection::size,
        Collectors.collectingAndThen(
            Collectors.mapping(
                l -> l.stream().filter(i -> i % 2 == 0).collect(Collectors.toList()),
                Collectors.toList()),
            i -> i.stream().flatMap(j -> j.stream()).collect(Collectors.toList()))));
Run Code Online (Sandbox Code Playgroud)

是否有一个更短的仅使用更好的方法

java java-8 java-stream collectors java-9

12
推荐指数
2
解决办法
728
查看次数

如何在Linux上查看和编辑临时端口范围?

在我的Linux系统中,临时端口范围显示不同的范围,如下所示

$ cat /proc/sys/net/ipv4/ip_local_port_range 
32768  61000 
Run Code Online (Sandbox Code Playgroud)

cat /etc/sysctl.conf | grep net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 9000 65500
Run Code Online (Sandbox Code Playgroud)

在我的系统中,哪个临时端口有效?

unix linux networking network-programming unix-socket

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

为什么std :: thread需要函数来运行rvalue?

有一件事std::thread我不明白:为什么构造std::thread函数的函数由rvalue运行?

我通常想要将一些成员的Functor运行到另一个线程.像这样:

struct Function
{
    void operator() ( /* some args */)
    {
        /* some code */
    }

    /* some members */
}


void run_thread()
{
    Functor f( /* some data */);
    std::thread thread(f, /* some data */);

    /* do something and wait for thread to finish */
}
Run Code Online (Sandbox Code Playgroud)

对于当前的实现,std::thread我必须确保我的对象正在实现移动语义.我不明白为什么我不能通过引用传递它.

额外的问题是:通过rvalue引用函数意味着什么?Lambda表达?

c++ multithreading c++11

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

TensorFlow中的MemoryError; 并且"使用xen从SysFS读取的成功NUMA节点具有负值(-1)"

我正在使用张量流版本:

0.12.1

Cuda工具集版本是8.

lrwxrwxrwx  1 root root   19 May 28 17:27 cuda -> /usr/local/cuda-8.0
Run Code Online (Sandbox Code Playgroud)

如此处所述 ,我已经下载并安装了cuDNN.但是从我的python脚本执行以下行时,我收到标题中提到的错误消息:

  model.fit_generator(train_generator,
   steps_per_epoch= len(train_samples),
   validation_data=validation_generator, 
   validation_steps=len(validation_samples),
   epochs=9)
Run Code Online (Sandbox Code Playgroud)

详细错误消息如下:

Using TensorFlow backend. 
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcublas.so locally 
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcudnn.so locally 
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcufft.so locally 
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcuda.so.1 locally 
I tensorflow/stream_executor/dso_loader.cc:128] successfully opened CUDA library libcurand.so locally 
Epoch 1/9 Exception in thread Thread-1: Traceback (most recent call last):   File " …
Run Code Online (Sandbox Code Playgroud)

python-3.x deep-learning tensorflow

6
推荐指数
2
解决办法
9257
查看次数

java streams:直截了当地减少

我有一个流MetricGroup,其中:

public class MetricGroup {

    private int uploadedDocs;
    private long uploadedKbs;

    // getters and setters

}
Run Code Online (Sandbox Code Playgroud)

我需要在一个指标中对所有指标进行sumarize.我的意思是,我需要所有添加metric.uploadedDocssumMetric.uploadedDocsmetric.uploadedKdssumMetric.uploadedKbs.

我想我需要某种东西 reduce

Stream.of(new MetricGroup(1,100), new MetricGroup(1,200))
    .reduce(????);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

java java-8 java-stream

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

TimeoutException:提取主题元数据Kafka时超时已过期

我一直在尝试使用Kubernetes在本地部署带有架构注册表的Kafka。但是,架构注册表窗格的日志显示此错误消息:

ERROR Server died unexpectedly:  (io.confluent.kafka.schemaregistry.rest.SchemaRegistryMain:51)
org.apache.kafka.common.errors.TimeoutException: Timeout expired while fetching topic metadata
Run Code Online (Sandbox Code Playgroud)

这种行为的原因可能是什么?'为了在本地运行Kubernetes,我将Minikube v0.32.0版本与Kubernetes v1.13.0版本一起使用

我的Kafka配置:

apiVersion: v1
kind: Service
metadata:
  name: kafka-1
spec:
  ports:
    - name: client
      port: 9092
  selector:
    app: kafka
    server-id: "1"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafka-1
spec:
  selector:
    matchLabels:
      app: kafka
      server-id: "1"
  replicas: 1
  template:
    metadata:
      labels:
        app: kafka
        server-id: "1"
    spec:
      volumes:
        - name: kafka-data
          emptyDir: {}
      containers:
        - name: server
          image: confluent/kafka:0.10.0.0-cp1
          env:
            - name: KAFKA_ZOOKEEPER_CONNECT
              value: zookeeper-1:2181
            - …
Run Code Online (Sandbox Code Playgroud)

apache-kafka kubernetes apache-zookeeper confluent-schema-registry

6
推荐指数
2
解决办法
8336
查看次数

JAVA GC:ParNew(促销失败),并发模式失败

我看到我的应用程序/平台内存利用率突然飙升.在GC详细日志中我看到如下:

1285.946:[GC 1285.946:[ ParNew(促销失败):353920K-> 353920K(353920K),0.8003983秒] 1286.747:[CMS1287.338:[CMS-con current-sweep:7.902/9.624 secs] [次:用户= 96.62 sys = 2.35,real = 9.62 secs](并发模式故障):2531317K-> 1161025K(2752512K),24.8330303 secs] 2860005K-> 1161025K(3106432K),[CMS Perm:37117K-> 3 6905K(62368K)],25.6341706 secs ] [时间:用户= 26.41 sys = 0.05,实际= 25.63秒] [POA RootPOA - 摆脱:17 oid:00 17 2E 29 23 33 49 34 25 3E opname:ping - 处理请求] 1312.367:[GC 1312.367:[ParNew] :314624K-> 30240K(353920K),0.0188874秒] 1475649K-> 1191266K(3106432K),0.0194380秒] [时间s:用户= 0.40 sys = 0.00,实际= 0.02秒] 1313.249:[GC 1313.249:[ParNew:344864K- > 39296K(353920K),0.0300220秒] 1505890K-> 1201198K(3106432K),0.0305488秒]

ParNew(促销失败),并发模式失败:请解释和如何解决这个问题.我相信由于GC故障,内存中突然出现峰值.

请求您的意见.

java memory garbage-collection java-ee

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

使用 std::initializer_list 显式构造函数和初始化

class P { 
    public:
explicit P( int a, int b, int c) {  
    std::cout<<"calling explicit constructor"<<"\n";
    } 

};


int main() {

P z {77,5,42}; // OK

P w = {77,5,42}; // ERROR due to explicit (no implicit type conversion allowed)

}
Run Code Online (Sandbox Code Playgroud)

我认为 {77,5,42}有隐式类型std::initialization_list<int>。如果是这种情况,是什么导致变量构造失败z

c++ c++11

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